gpt4 book ai didi

java - 如何利用递归回溯来解决8皇后问题?

转载 作者:行者123 更新时间:2023-11-30 07:00:21 24 4
gpt4 key购买 nike

更新的代码:我的最后一个问题是如何获得它,以便我的程序打印 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皇后问题。 n 皇后问题是一个难题,需要将 n 个国际象棋皇后放置在 n × n 的棋盘上,这样皇后就不会互相攻击。

我需要写一个public solveQueens(int n)解决nxn板问题的方法

我还需要写一个私有(private)递归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 棋盘以及如何放置皇后以使它们不会互相攻击的解释吗?

最佳答案

我在solveQueens和placeQueen中做了一些更改:

public class Queen{

public static int[] solveQueens(int n){
int board[] = new int[n];
placeQueen(board,0); //it fills the board
return board;
}
private static boolean placeQueen(int[] board, int column){
int n = board.length;
int row;
if (n == column){
return true;
}else{
for (row = 0; row < n; row++){
int c;
for (c=0; c<column; c++){
if (board[c]==row || c-column==board[c]-row || column-c==board[c]-row){
//check if it is safe position (we know 2 queens couldn't place in a same column or row or diameter
break;
}
}
if (c==column){ //if previous loop didn't break...=> it is safe position
board[column]=row;
if (placeQueen(board, column+1)) //if it is possible to fill the rest of board //else: test the next row
return true;
}
}
}
return false;
}
public static void main(String args[]){
int finished[] = solveQueens(8);
for (int item: finished){
System.out.print(item);
}
}
}

关于java - 如何利用递归回溯来解决8皇后问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41031910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com