Skip to content

Commit 311a9e8

Browse files
committed
棋盘,对角线判断,深搜
1 parent fbf5a31 commit 311a9e8

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

DFS/N-Queens I&& II

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// 这种走迷宫之类的棋盘问题,若是要按个去试,就是NP问题,时间复杂度很大,N!,一般是采用深搜来解决
2+
// 难点往往是细节上的实现,如收敛条件和终止条件的确认,进行下一步的条件判断等
3+
// 这里存在的难点就是判断下一步皇后的存放,其实也很简单,就是对角线和行的判断,有两种方式
4+
class Solution {
5+
private:
6+
vector<int> columns;
7+
vector<int> principle_diagonals;
8+
vector<int> counter_diagonals;
9+
void dfs(int row,vector<int> &queen_col,vector<vector<string>> &results)
10+
{
11+
const int rows = queen_col.size();
12+
if(row == rows)
13+
{
14+
vector<string> result;//一个答案
15+
for(int i = 0;i < rows;i++)
16+
{
17+
string solu(rows,'.');// n 个 string,答案中的每一行
18+
solu[queen_col[i]] = 'Q'; // 如果按个去找,time limited
19+
result.push_back(solu);
20+
}
21+
results.push_back(result);
22+
return;
23+
}
24+
for(int j = 0;j < rows;j++) // 每一行去检查搜索
25+
{
26+
if(columns[j] == 0 &&principle_diagonals[row + j] == 0 &&
27+
counter_diagonals[row - j + rows] == 0) // 对角线上的判断为什么是这样判断的。。??
28+
{
29+
queen_col[row] = j;// 满足条件,将该行上的queen 列号存储
30+
columns[j] = principle_diagonals[row + j] = counter_diagonals[row - j + rows] = 1;// 相应条件设置
31+
dfs(row + 1,queen_col,results); // 下一行 ,深搜的标志体现
32+
queen_col[row] = 0; // 撤销动作
33+
columns[j] = principle_diagonals[row + j] = counter_diagonals[row -j + rows] = 0;
34+
}
35+
}
36+
}
37+
38+
public:
39+
vector<vector<string> > solveNQueens(int n) {
40+
this->columns = vector<int> (n,0); // 当前列是否有皇后
41+
this->principle_diagonals = vector<int> (2*n,0); // 主对角线上的
42+
this->counter_diagonals = vector<int> (2*n,0);
43+
vector<int> row_col(n,0);
44+
vector<vector<string>> results;
45+
dfs(0,row_col,results);
46+
return results;
47+
}
48+
};
49+
50+
51+
// 两种方法判断对角线,充分体现了空间换时间的思路
52+
private boolean check(int row, int[] columnForRow)
53+
{
54+
for(int i=0;i<row;i++)
55+
{
56+
if(columnForRow[row]==columnForRow[i] || Math.abs(columnForRow[row]-columnForRow[i])==row-i) //行列差的相等=》对角线
57+
return false;
58+
}
59+
return true;
60+
}
61+
62+
// N皇后II的问题就是设置一个全局变量,找到一个解就加1,

0 commit comments

Comments
 (0)