【发布时间】:2017-04-23 05:59:09
【问题描述】:
更新的代码:我的最后一个问题是如何获得它,以便我的程序打印 8x8 板的所有 92 个解决方案,而没有任何皇后相互攻击?到目前为止,我的代码只打印了 1 个解决方案。例如,当我将其更改为 4x4 板时,我只有 1 个解决方案,而我相信应该有 2 个。
public class Queen{
public static void display(int[] board){
int n = board.length;
for(int column = 0; column < n; column++){
for(int row = 0; row < n; row++){
if(board[column] == row)
System.out.print('Q');
else
System.out.print('x');
}
System.out.print('\n');
}
}
public static int[] solveQueens(int n){
int board[] = new int[n];
placeQueen(board,0);
return board;
}
private static boolean placeQueen(int[] board, int column){
int n = board.length;
if (n == column){
return true;
}else{
for (int row = 0; row < n; row++){
int i; //remove
for (i = 0; i < column; i++){ //for (int i)
if (board[i] == row || i - column == board[i] - row || column - i == board[i] - row){
break;
}
}
if (i == column){
board[column] = row;
if (placeQueen(board, column + 1))
return true;
}
}
}
return false;
}
public static void main(String args[]){
int finished[] = solveQueens(8);
display(finished);
}
}
现在我的程序返回:
Qxxxxxxx
xxxxQxxx
xxxxxxxQ
xxxxxQxx
xxQxxxxx
xxxxxxQx
xQxxxxxx
xxxQxxxx
旧代码: 我需要使用递归回溯来解决 8-queens 问题。 n 皇后问题是一个难题,需要在 n × n 棋盘上放置 n 个国际象棋皇后,这样所有的皇后都不会互相攻击。
我需要写一个public solveQueens(int n)方法来解决nxn板的问题
我还需要编写一个私有递归placeQueen(board, column) 方法来尝试在指定列中放置一个皇后。
这是我目前的代码:
public class Queen{
public static int[] solveQueens(int n){
int board[] = new int[n];
int finished[] = placeQueen(board,0);
return finished;
}
private static int[] placeQueen(int[] board, int column){
int n = board.length;
int row = column;
if (n == column){
return board;
}else{
for (row = n; row < n; row++){
board[column] = row;
if (board[n] == 0 && board[n-1] == 0 && board[n+1] == 0){
board[n] = 1;
placeQueen(board, column+1);
}
}
for (row = n; row < n; row++){
board[row] = column;
if (board[n] == 0 && board[n-1] == 0 && board[n+1] == 0){
board[n] = 1;
placeQueen(board, column+1);
}
}
}
return board;
}
public static void main(String args[]){
int finished[] = solveQueens(8);
for (int item: finished){
System.out.print(item);
}
}
}
每当我运行我的程序时,它返回的只是
----jGRASP exec: java Queen
00000000
有没有关于如何设置我的 8x8 棋盘以及如何放置皇后以免它们相互攻击的任何解释?
【问题讨论】:
-
您有两个 for 循环,例如
for (row = n; row < n; row++){。这些循环不会运行,因为条件从一开始就为假。你的意思是row = 0? -
如果您不知道如何使用您的调试器 (1) 学习,您将需要 (2) 在您学习之前,坚持使用
System.out.println()语句来跟踪您的代码的执行情况并通知您一些变量的值。 -
这个谜题不仅仅是一个解决方案板。
-
最好在您的代码中包含 cmets,以便立即理解。
-
@WillNess 我更新了代码,我的问题是我想查看 8x8 板的所有 92 个解决方案,但我的代码只打印 1 个解决方案。
标签: java arrays recursion stack call