【问题标题】:How to use recursive backtracking to solve 8 queens? [closed]如何使用递归回溯解决 8 个皇后? [关闭]
【发布时间】: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 &lt; n; row++){。这些循环不会运行,因为条件从一开始就为假。你的意思是row = 0
  • 如果您不知道如何使用您的调试器 (1) 学习,您将需要 (2) 在您学习之前,坚持使用System.out.println() 语句来跟踪您的代码的执行情况并通知您一些变量的值。
  • 这个谜题不仅仅是一个解决方案板。
  • 最好在您的代码中包含 cmets,以便立即理解。
  • @WillNess 我更新了代码,我的问题是我想查看 8x8 板的所有 92 个解决方案,但我的代码只打印 1 个解决方案。

标签: java arrays recursion stack call


【解决方案1】:

我对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);
        }
    }
}

【讨论】:

  • 您知道如何打印出整个 8x8 板吗?比如 x x x x x x x x x x 也有 8 行?
  • 可以更改主函数并添加显示函数:
  • public static void display(int[] board) { int n = board.length; for(int c=0; c
  • 谢谢你!真的很感激!
  • 是的!在placeQueen函数中,在if (n == column){ return true; }可以调用display方法,而不是返回true,返回false!所以它会告诉你所有的答案......
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多