Java
Hiện tại, mã của tôi rất dài và tẻ nhạt, tôi đang làm việc để làm cho nó nhanh hơn. Tôi sử dụng một phương thức đệ quy để tìm các giá trị. Nó tính toán 5 đầu tiên trong vòng 2 hoặc 3 giây, nhưng sau đó sẽ chậm hơn nhiều. Ngoài ra, tôi không chắc chắn nếu các con số là đúng, nhưng vài số đầu tiên dường như xếp hàng với các bình luận. Mọi góp ý đều được chào đón.
Đầu ra
2x2: 3
4x4: 30
6x6: 410
8x8: 6148
10x10: 96120
Giải trình
Ý tưởng cơ bản là đệ quy. Về cơ bản, bạn bắt đầu với một bảng trống, một bảng với tất cả các số không. Phương thức đệ quy chỉ kiểm tra xem liệu nó có thể đặt một con tốt đen hoặc trắng ở vị trí tiếp theo hay không, nếu nó chỉ có thể đặt một màu, nó sẽ đặt nó ở đó và tự gọi nó. Nếu nó có thể đặt cả hai màu, nó tự gọi hai lần, một màu với mỗi màu. Mỗi lần nó tự gọi nó sẽ giảm các hình vuông bên trái và màu sắc phù hợp còn lại. Khi nó đã lấp đầy toàn bộ bảng, nó trả về số hiện tại + 1. Nếu phát hiện ra rằng không có cách nào để đặt một con tốt đen hoặc trắng ở vị trí tiếp theo, nó sẽ trả về 0, có nghĩa là đó là một con đường chết.
Mã
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;
}
}
}
}
}
Hãy thử ở đây (Không chạy đủ nhanh cho Ideone nên giá trị cuối cùng không được in, có vẻ như giải pháp của tôi không tốt lắm!)