52.N-Queens II

题目链接:https://leetcode.com/problems/n-queens-ii/description/

题目大意:返回N皇后的所有解的个数。

法一:直接用51题的代码,只是返回值变成list.size()即可,代码如下(耗时9ms):

 1     public int solveNQueens(int n) {
 2         int[] res = new int[n];//res的下标表示皇后放置在第几行,res的值表示皇后放置在第几列
 3         List<List<String>> list = new LinkedList<List<String>>();//list存储最终返回的所有解
 4         int[][] vis = new int[3][n + n];//vis标记哪一列,哪条主对角线,哪条副对角线已经放置值
 5         for(int i = 0; i < 3; i++) {//初始化标记数组
 6             for(int j = 0; j < n; j++) {
 7                 vis[i][j] = 0;
 8             }
 9         }
10         dfs(res, 0, n, list, vis);
11         
12         return list.size();
13     }
14     
15     public static void dfs(int[] res, int row, int n, List<List<String>> list, int[][] vis) {
16         if(row == n) {//如果已经放置完所有的列,则将当前解加入到list中
17             List<String> listIn = new LinkedList<String>();//先将内置的List赋值
18             for(int i = 0; i < res.length; i++) {
19                 String s = "";
20                 for(int j = 0; j < n; j++) {
21                     if(j == res[i]) {
22                         s += "Q";
23                     }
24                     else {
25                         s += ".";
26                     }
27                 }
28                 listIn.add(s);
29             }
30             list.add(listIn);//再将内置的list的值加入到要返回的list中
31             return;
32         }
33         for(int col = 0; col < n; col++) {//对于每一行要放置的皇后,col表示当前行可以放置的列
34             if(vis[0][col] == 0 && vis[1][col + row] == 0 && vis[2][row - col + n] == 0) {//关键判断:不同行,不同列,不同主对角线,不同副对角线
35                 vis[0][col] = 1;//
36                 vis[1][col + row] = 1;//副对角线
37                 vis[2][row - col + n] = 1;//主对角线
38                 res[row] = col;//存储皇后应该放置的位置
39                 dfs(res, row + 1, n, list, vis);//递归
40                 vis[0][col] = 0;
41                 vis[1][col + row] = 0;
42                 vis[2][row - col + n] = 0;
43             }
44         }
45     }
View Code

法二:将51题的代码改一下,不用再一一赋值给list,而是只用计算解个数即可,代码如下(耗时3ms):

 1     public int solveNQueens(int n) {
 2         int[][] vis = new int[3][n + n];//vis标记哪一列,哪条主对角线,哪条副对角线已经放置值
 3         for(int i = 0; i < 3; i++) {//初始化标记数组
 4             for(int j = 0; j < n; j++) {
 5                 vis[i][j] = 0;
 6             }
 7         }
 8         int res = 0;
 9         res = dfs(0, n, vis, res);
10         return res;
11     }
12     
13     public static int dfs(int row, int n, int[][] vis, int res) {
14         if(row == n) {//如果已经放置完所有的列,则将当前解加入到list中
15             res++;
16             return res;
17         }
18         for(int col = 0; col < n; col++) {//对于每一行要放置的皇后,col表示当前行可以放置的列
19             if(vis[0][col] == 0 && vis[1][col + row] == 0 && vis[2][row - col + n] == 0) {//关键判断:不同行,不同列,不同主对角线,不同副对角线
20                 vis[0][col] = 1;//
21                 vis[1][col + row] = 1;//副对角线
22                 vis[2][row - col + n] = 1;//主对角线
23                 res = dfs(row + 1, n, vis, res);//递归
24                 vis[0][col] = 0;
25                 vis[1][col + row] = 0;
26                 vis[2][row - col + n] = 0;
27             }
28         }
29         return res;
30     }
View Code

 

posted on 2017-10-29 11:49  二十年后20  阅读(144)  评论(0编辑  收藏  举报

导航