我在编写8皇后问题时遇到了麻烦。我编写了一个类来帮助我解决它,但由于某种原因,我做错了。我有点理解应该发生什么。
另外,我们必须使用递归来解决它,但我不知道如何使用我读过的回溯,所以我只是在方法中使用它来检查一个位置是否合法。
我的电路板是String [] [] board = { { "O", "O"...
等,有8行8列。
如果我在概念上遇到任何错误或者犯了严重的Java错误,请说出来:D
谢谢!
public void solve () {
int Queens = NUM_Queens - 1;
while (Queens > 0) {
for (int col = 0; col < 8; col++) {
int row = -1;
boolean c = false;
while (c = false && row < 8) {
row ++;
c = checkPos (row, col);
}
if (c == true) {
board[row][col] = "Q";
Queens--;
}
else
System.out.println("Error");
}
}
printBoard ();
}
// printing the board
public void printBoard () {
String ret = "";
for (int i = 0; i < 8; i++) {
for (int a = 0; a < 8; a++)
ret += (board[i][a] + ", ");
ret += ("\n");
}
System.out.print (ret);
}
// checking if a position is a legitimate location to put a Queen
public boolean checkPos (int y, int x) {
boolean r = true, d = true, u = true, co = true;
r = checkPosR (y, 0);
co = checkPosC (0, x);
int col = x;
int row = y;
while (row != 0 && col != 0 ) { //setting up to check diagonally downwards
row--;
col--;
}
d = checkPosDD (row, col);
col = x;
row = y;
while (row != 7 && col != 0 ) { //setting up to check diagonally upwards
row++;
col--;
}
d = checkPosDU (row, col);
if (r = true && d = true && u = true && co = true)
return true;
else
return false;
}
// checking the row
public boolean checkPosR (int y, int x) {
if (board[y][x].contentEquals("Q"))
return false;
else if (board[y][x].contentEquals("O") && x == 7)
return true;
else //if (board[y][x].contentEquals("O"))
return checkPosR (y, x+1);
}
// checking the column
public boolean checkPosC (int y, int x) {
if (board[y][x].contentEquals("Q"))
return false;
else if (board[y][x].contentEquals("O") && y == 7)
return true;
else //if (board[y][x].contentEquals("O"))
return checkPosR (y+1, x);
}
// checking the diagonals from top left to bottom right
public boolean checkPosDD (int y, int x) {
if (board[y][x].contentEquals("Q"))
return false;
else if (board[y][x].contentEquals("O") && (x == 7 || y == 7))
return true;
else //if (board[y][x].contentEquals("O"))
return checkPosR (y+1, x+1);
}
// checking the diagonals from bottom left to up right
public boolean checkPosDU (int y, int x) {
if (board[y][x].contentEquals("Q"))
return false;
else if (board[y][x].contentEquals("O") && (x == 7 || y == 0))
return true;
else //if (board[y][x].contentEquals("O"))
return checkPosR (y-1, x+1);
}
}
答案 0 :(得分:1)
因为这是家庭作业,解决方案,但不是代码。
尝试编写一个只处理单个列上需要发生的事情的方法;这是你应该使用递归的地方。通过检查是否存在解决方案来进行回溯,如果不存在,则撤消上次更改(即更改女王位置)并再试一次。如果您只关注问题的一部分(一列),这比同时考虑所有列要容易得多。
正如Quetzalcoatl指出的那样,你在第一个循环中为你的变量分配了false
。你可能不想这样做。您应该始终在编译器中启用所有警告(使用-Xlint运行javac)并修复它们。
答案 1 :(得分:-1)
你正在尝试某种蛮力,但正如你已经提到的,你没有递归。 你的程序试图将王后放在第一个可能的位置上。但最终找不到解决方案。因此,您的第一个假设(您的第一个女王的位置)无效。您必须返回此状态。并且必须假设您的checkPos(x,y)是false而不是true。
现在有一些提示:
int[N] queens
更适合代表。