Это мой текущий код:
package Queens;
import java.io.IOException;
public class NQueens {
static class Queen {
//class that holds positions
int column, row;
Queen(int column, int row){
this.column = column;
this.row = row;
}
}
public static void main(String[] args) throws IOException {
//n is subject to change to be read from an input file
int n = 5;
Queen position[] = new Queen[n];
//if solutions are found, print out the coordinates of the queens
if (backTracking(n, 0, position)) {
for(int i = 0; i < n; i++) {
System.out.println("(" + position[i].column + ", " + position[i].row + ") ");
}
} else {
System.out.println("No Solution");
}
}
public static boolean isAttacking(int existingQueen, int row, int column, Queen position[]) {
//determines if attacking or not
int positionRow = position[existingQueen].row;
int positionColumn = position[existingQueen].column;
//if in the same column, row, or diagonal
if (position[existingQueen].column == column ||
positionRow == row ||
positionRow + positionColumn == row + column ||
positionRow - positionColumn == row - column) {
return true;
}
return false;
}
public static boolean backTracking(int n, int row, Queen[] position) {
//backtracking algorithim
if (row == n) {
return true;
}
for (int column = 0; column < n; column++) {
boolean safeSpace = true;
position[row] = new Queen(column, row);
for(int existingQueen = 0; existingQueen < row; existingQueen++) {
if (isAttacking(existingQueen, row, column, position)) {
safeSpace = false;
}
}
if (safeSpace) {
if (backTracking(n, row + 1, position)) {
return true;
}
}
}
return false;
}
}
Он работает совершенно нормально, как, однако, я хочу сначала поставить ферзь на position[0]
, а затем алгоритм найти доступные позиции на основеэта королева (она также может переместить начальную королеву).Если он не может найти его, он возвращает "no solution"
.
Действительно пытаясь выяснить это, поэтому любая помощь будет принята с благодарностью!