标签:n皇后 枚举 全局 oid 标记 dfs 大小 span 数组下标
(按行枚举) 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 };
标签:n皇后 枚举 全局 oid 标记 dfs 大小 span 数组下标
原文地址:https://www.cnblogs.com/yuhong1103/p/12521012.html