जावा
वर्तमान में, मेरा कोड बहुत लंबा और थकाऊ है, मैं इसे और तेज़ बनाने पर काम कर रहा हूँ। मूल्यों को खोजने के लिए मैं एक पुनरावर्ती विधि का उपयोग करता हूं। यह 2 या 3 सेकंड के भीतर पहले 5 की गणना करता है, लेकिन यह बाद में बहुत धीमा हो जाता है। इसके अलावा, अगर नंबर सही हैं, तो मुझे अभी तक यकीन नहीं है, लेकिन पहले कुछ टिप्पणी के साथ लाइन में लगते हैं। किसी भी सुझाव का स्वागत है।
उत्पादन
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 के लिए तेज़ी से नहीं चलेगा इसलिए अंतिम मूल्य प्रिंट नहीं करता है, ऐसा लगता है कि मेरा समाधान बहुत अच्छा नहीं है!)