其他分享
首页 > 其他分享> > 51. N皇后

51. N皇后

作者:互联网

(按行枚举) O(n!)
说明:对角线dg[u + i],反对角线udg[n - u + i]中的下标表示的是截距
(u, i)即(x, y)
对角线y = x + b, 截距b = y - x
(因为我们要把b当做数组下标,所以b不能是负的,所以我们+n,保证是结果是正的)

反对角线y = -x + b, 截距是b = y + x

 

 1 class Solution 
 2 {
 3     vector<vector<string>> res;
 4     vector<string> temp;//临时路径
 5     vector<bool> col,m,s;//列,主对角线,副对角线
 6     int n;
 7 public:
 8     vector<vector<string>> solveNQueens(int N) 
 9     {
10         n = N;//将N设置成一个全局变量
11         temp = vector<string>(n,string(n,'.'));//n行,每一行有n个.
12         col = m = s = vector<bool>(2 * n,false);//标记数组大小设置稍大一点
13         dfs(0);
14         return res;
15     }
16 
17     void dfs(int x)// 行
18     {   // x == n 表示已经搜了n行
19         if(x == n)
20         {
21             res.push_back(temp);
22             return;
23         }
24         for(int y = 0;y < n;y ++)//对某一行的每一列进行搜索
25         {
26             if(!col[y] && !m[x + y] && !s[y - x + n])
27             {
28                 temp[x][y] = 'Q';
29                 col[y] = m[x + y] = s[y - x + n] = true;
30                 dfs(x + 1);
31                 
32                 // 恢复现场 这步很关键
33                 col[y] = m[x + y] = s[y - x + n] = false;
34                 temp[x][y] = '.';
35             }
36         }
37     }
38 };

 

标签:截距,temp,int,51,vector,对角线,皇后,col
来源: https://www.cnblogs.com/yuhong1103/p/12521012.html