Leetcode 51.N后问题

N后问题

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

上图为 8 皇后问题的一种解法。

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

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

示例:

输入: 4

输出: [

[".Q..", // 解法 1

"...Q",

"Q...",

"..Q."],

["..Q.", // 解法 2

"Q...",

"...Q",

".Q.."]

]

解释: 4 皇后问题存在两个不同的解法。

 1 import java.util.*;
 2 
 3 public class Solution{
 4     public List<List<String>> solveNQueens(int n){
 5         List<List<String>> res=new ArrayList<List<String>>();
 6         int[] queenList=new int[n];//第i个位置存放的数表示row行时,Q的列
 7         placeQueen(queenList,0,n,res);//在第0行放Q
 8         return res;
 9     }
10 
11     private void placeQueen(int[] queenList,int row,int n,List<List<String>> res){
12         if(row==n){
13             ArrayList<String> list=new ArrayList<String>();
14             for(int i=0;i<n;i++){
15                 String str="";
16                 for(int col=0;col<n;col++){
17                     if(queenList[i]==col){
18                         str+="Q";
19                     }else{
20                         str+=".";
21                     }
22                 }
23                 list.add(str);
24             }
25             res.add(list);
26         }
27         for(int col=0;col<n;col++){
28             if(isValid(queenList,row,col)){
29                 queenList[row]=col;
30                 placeQueen(queenList,row+1,n,res);
31             }
32         }
33     }
34 
35     private boolean isValid(int[] queenList,int row,int col){
36         for(int i=0;i<row;i++){
37             int pos=queenList[i];
38             if(pos==col)
39                 return false;
40             if(pos+row-i==col)
41                 return false;
42             if(pos-row+i==col)
43                 return false;
44         }
45         return true;
46     }
47 }
原文地址:https://www.cnblogs.com/kexinxin/p/10163030.html