题目链接: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 }
法二:将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 }