Java
Derzeit ist mein Code sehr lang und langweilig. Ich arbeite daran, ihn schneller zu machen. Ich benutze eine rekursive Methode, um die Werte zu finden. Es berechnet die ersten 5 innerhalb von 2 oder 3 Sekunden, wird danach aber viel langsamer. Ich bin mir auch noch nicht sicher, ob die Zahlen stimmen, aber die ersten scheinen mit den Kommentaren übereinzustimmen. Anregungen sind willkommen.
Ausgabe
2x2: 3
4x4: 30
6x6: 410
8x8: 6148
10x10: 96120
Erläuterung
Die Grundidee ist Rekursion. Im Wesentlichen beginnen Sie mit einer leeren Tafel, einer Tafel mit allen Nullen. Die rekursive Methode prüft nur, ob sie einen schwarzen oder weißen Bauern an die nächste Position bringen kann. Wenn sie nur eine Farbe setzen kann, setzt sie sie dort ab und ruft sich selbst auf. Wenn es beide Farben setzen kann, nennt es sich zweimal, eine mit jeder Farbe. Jedes Mal, wenn es sich selbst nennt, werden die verbleibenden Quadrate und die entsprechende verbleibende Farbe verringert. Wenn es das gesamte Brett gefüllt hat, gibt es die aktuelle Anzahl + 1 zurück. Wenn es herausfindet, dass es keine Möglichkeit gibt, einen schwarzen oder weißen Bauern an die nächste Position zu bringen, gibt es 0 zurück, was bedeutet, dass es ein toter Pfad ist.
Code
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;
}
}
}
}
}
Probieren Sie es hier aus (Läuft für Ideone nicht schnell genug, sodass der letzte Wert nicht gedruckt wird. Meine Lösung scheint nicht sehr gut zu sein!)