Ich versuche eine Lösung für das Problem der Acht Königinnen zu finden, unabhängig vom Ausgangspunkt. Unten ist meine Solver-Klasse, aber es funktioniert aus irgendeinem Grund nicht, wenn ich die Königin in eine andere Reihe als die erste stelle.Acht-König-Algorithmus für verschiedene Startpunkte
import java.util.*;
public class Queens {
private static int x;
private static int y;
private static ArrayList<Integer> rows = new ArrayList<Integer>();
public Queens(int index, int row, int pos) {
for (int i = 0; i<index; i++)
rows.add(i);
rows.remove(row);
x = pos;
y = row;
}
public static boolean solve(int row, int[][] board, int N, int pos) {
board[y][x] = 1;
System.out.println("row: " + row);
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
if(board[i][j]==1) System.out.print("Q ");
else System.out.print("* ");
}
System.out.println();
}
System.out.println();
if(row>=N-1) return true;
for(int position = pos; position < N; position++) {
if(isValid(board, rows.get(row), position, N)) {
board[rows.get(row)][position] = 1;
if(!solve(row+1, board, N, 0)) {
board[rows.get(row)][position] = 0;
} else
return true;
}
}
return false;
}
public static boolean isValid(int[][] board, int y, int x, int N) {
int i, j;
for(i = 0; i < y; i++)
if(board[i][x]==1)
return false;
i = y - 1;
j = x - 1;
while((i>=0)&&(j>=0))
if(board[i--][j--]==1) return false;
i = y - 1;
j = x + 1;
while((i>=0)&&(j<N))
if(board[i--][j++]==1) return false;
return true;
}
}
Zum Beispiel, wenn ich die anfängliche Königin an Bord legen [2] [2], das ist die Lösung, die ich erhalte:
Q * * * * * * *
* * Q * * * * *
* * Q * * * * *
* * * * * Q * *
* * * * * * * Q
* Q * * * * * *
* * * Q * * * *
* * * * * * Q *
Was mit dem Code falsch? Warum ignoriert es das ursprüngliche Stück? Danke im Voraus.
Wo ist Ihr Debugging-Versuch? Fügen Sie Druckanweisungen an strategischen Orten ein, um den Kontroll- und Datenfluss zu verfolgen. Grabe nach einem bestimmten Problem. Beschreibe es und poste die detaillierte Ausgabe hier. – Prune