改自LeetCode 51 N皇后 (输出方案棋盘) 我写的
#include<iostream>
#include<vector>
using namespace std;
int n, _n;
vector<bool> col, diag, udiag; //记录列上,对角线,反对角线上是否有数
//vector<vector<string>> ans;
vector<string> path; // 当前搜索的方案
void dfs(int u) //我们的算法先定义u为行,(然后后面都以)i为列(来写)。
{
if (u == n) //如果搜到了最后一步
{
for (int i = 0; i < n; i++) cout << path[i] << endl; //找到了答案,加入ans
puts("");
return;
}
// y = x + k; 截距k = y - x + n (由于可能小于0所以加n变为正))
// y = -x + k; k = y + x;
for (int i = 0; i < n; i++)
{
if (!col[i] && !diag[u - i + n] && !udiag[u + i])
{
col[i] = diag[u - i + n] = udiag[u + i] = true;
path[u][i] = 'Q';
dfs(u + 1);
path[u][i] = '.'; //恢复现场【回溯】
col[i] = diag[u - i + n] = udiag[u + i] = false;
}
}
}
int main()
{
cin >> _n;
// 检查三个方向即可。col[]竖着, diag[]对角线,udiag[] 反对角。(当前那些列有Q, 哪些对角线有Q, 哪些反对角有Q)
// (2n-1)条对角线
n = _n;
col = vector<bool>(n); //初始化大小为n
diag = udiag = vector<bool>(n * 2); // 对角线2n(2n-1就够)
path = vector<string>(n, string(n, '.')); // 初始化为n个点.
dfs(0);
}
或者简化原始点用普通char来存path也行,不用vector、
#include<iostream>
using namespace std;
const int N = 20;
int n;
char g[N][N];
bool col[N], diag[N], udiag[N];
void dfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i++) cout << g[i] << endl;
puts("");
}
for (int i = 0 ; i < n; i++)
{
if (!col[i] && !diag[u - i + n] && !udiag[u + i])
{
col[i] = diag[u - i + n] = udiag[u + i] = true;
g[u][i] = 'Q'; // g[x][y] u是行,i是列
dfs(u + 1);
col[i] = diag[u - i + n] = udiag[u + i] = false;
g[u][i] = '.';
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = '.';
dfs(0);
}