ชวา
ปัจจุบันรหัสของฉันยาวและน่าเบื่อมากฉันกำลังพยายามทำให้เร็วขึ้น ฉันใช้วิธีเรียกซ้ำเพื่อหาค่า มันคำนวณ 5 ครั้งแรกภายใน 2 หรือ 3 วินาที แต่มันก็ช้าลงมากในภายหลัง นอกจากนี้ฉันยังไม่แน่ใจว่าถ้าตัวเลขถูกต้อง แต่ไม่กี่คนแรกที่ดูเหมือนจะสอดคล้องกับความคิดเห็น ข้อเสนอแนะใด ๆ ยินดีต้อนรับ
เอาท์พุต
2x2: 3
4x4: 30
6x6: 410
8x8: 6148
10x10: 96120
คำอธิบาย
แนวคิดพื้นฐานคือการสอบถามซ้ำ โดยพื้นฐานแล้วคุณเริ่มต้นด้วยกระดานเปล่ากระดานที่มีศูนย์ทั้งหมด วิธีการเรียกซ้ำเพียงตรวจสอบเพื่อดูว่ามันสามารถวางเบี้ยสีดำหรือสีขาวในตำแหน่งถัดไปถ้ามันสามารถใส่เพียงสีเดียวมันวางไว้ที่นั่นและเรียกตัวเอง ถ้ามันสามารถใส่ทั้งสองสีมันเรียกตัวเองว่าสองครั้งหนึ่งกับแต่ละสี ทุกครั้งที่มันเรียกมันว่ามันจะลดช่องสี่เหลี่ยมที่เหลือและสีที่เหมาะสม เมื่อมันเต็มกระดานทั้งหมดมันจะส่งกลับจำนวนปัจจุบัน + 1 หากพบว่าไม่มีวิธีที่จะวางเบี้ยสีดำหรือสีขาวในตำแหน่งถัดไปก็จะส่งกลับ 0 ซึ่งหมายความว่ามันเป็นเส้นทางที่ตาย
รหัส
public class Chess {
public static void main(String[] args){
System.out.println(solve(1));
System.out.println(solve(2));
System.out.println(solve(3));
System.out.println(solve(4));
System.out.println(solve(5));
}
static int solve(int n){
int m =2*n;
int[][] b = new int[m][m];
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
b[i][j]=0;
}
}
return count(m,m*m,m*m/2,m*m/2,0,b);
}
static int count(int n,int sqLeft, int bLeft, int wLeft, int count, int[][] b){
if(sqLeft == 0){
/*for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
System.out.print(b[i][j]);
}
System.out.println();
}
System.out.println();*/
return count+1;
}
int x=(sqLeft-1)%n;
int y=(sqLeft-1)/n;
if(wLeft==0){
if(y!=0){
if ((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!= 1)) {
b[x][y] = 2;
return count(n, sqLeft-1, bLeft-1, wLeft, count, b);
} else {
return 0;
}
} else {
b[x][y]=2;
return count(n,sqLeft-1,bLeft-1,wLeft,count,b);
}
} else if(bLeft==0){
if(y!=n-1){
if((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2)){
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
} else {
return 0;
}
} else {
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
}
} else{
if(y==0){
if((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2)){
int[][] c=new int[n][n];
for(int i = 0; i < n; i++){
System.arraycopy(b[i], 0, c[i], 0, n);
}
b[x][y]=2;
c[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,c)+count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else {
b[x][y]=2;
return count(n,sqLeft-1,bLeft-1,wLeft,count,b);
}
}else if(y==n-1){
if((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!=1)){
int[][] c=new int[n][n];
for(int i = 0; i < n; i++){
System.arraycopy(b[i], 0, c[i], 0, n);
}
b[x][y]=2;
c[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,c)+count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else {
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
}
}else{
if(((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!=1))&&((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2))){
int[][] c=new int[n][n];
for(int i = 0; i < n; i++){
System.arraycopy(b[i], 0, c[i], 0, n);
}
b[x][y]=2;
c[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,c)+count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else if ((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!=1)){
b[x][y]=2;
return count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else if ((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2)){
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
} else {
return 0;
}
}
}
}
}
ลองที่นี่ (ไม่เร็วพอสำหรับ Ideone ดังนั้นค่าสุดท้ายไม่พิมพ์ออกมาดูเหมือนว่าโซลูชันของฉันจะไม่ดีมาก!)