51. N 皇后

Posted yangbocsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51. N 皇后相关的知识,希望对你有一定的参考价值。

51. N 皇后

一、题目

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

二、参考代码


class Solution 

   List<List<String>> res = new LinkedList<>();
   public List<List<String>> solveNQueens(int n) 
      String[][] board = new String[n][n];
      for (int i = 0; i < n; i++) 
         Arrays.fill(board[i],".");   
      
      // '.' 表示空,'Q' 表示皇后,初始化空棋盘。

      backtrack(board,0);
      return res;

   
   public void backtrack(String[][] board, int row)
      // 结束条件   
      if(row == board.length)
         res.add(toString(board)); // [".Q..","...Q","Q...","..Q."]
         return;
      
      int n = board[row].length;
      for (int i = 0; i < n ; i++) 
         // true的话,是没有冲突
         if (isVisted(board,row,i))
            board[row][i] = "Q";
            // 进入下一行决策
            backtrack(board, row + 1);
            board[row][i] = ".";
          
      
   

   public boolean isVisted(String[][] board, int row,int col)
      int n = board.length;
      // 检查列是否有皇后互相冲突
      for (int i = 0; i <= row; i++) 
         if (board[i][col] == "Q")
            return false;
         
      
      // 检查左上方是否有皇后互相冲突
      for (int i = row - 1,j = col + 1; i >= 0 && j < n; i--, j++) 
         if (board[i][j] == "Q")
            return false;
         
      
      // 检查左上方
      for (int i = row - 1, j = col - 1; i >=0 && j >= 0 ; i--,j--) 
            if  (board[i][j] == "Q")
               return false;
            
      
      return true;
   

    // 将二维的String数组,转换成字符列表 //["..Q.","Q...","...Q",".Q.."]
   public List toString(String[][] ans)
      LinkedList<String> list = new LinkedList<>();
      for(String[] i : ans)
         StringBuilder sb = new StringBuilder();
         for (int j = 0; j < i.length; j++) 
            sb.append(i[j]);
         
         list.add(sb.toString());
      
      return list;
   


以上是关于51. N 皇后的主要内容,如果未能解决你的问题,请参考以下文章

51. N 皇后

51. N 皇后

51. N 皇后

51. N 皇后

Leetcode No.51 N皇后

Leetcode刷题Python51. N 皇后