AcWing 843. n-皇后问题,判定对角线的新方式
原题链接
中等
作者:
0weili
,
2020-10-12 17:56:06
,
所有人可见
,
阅读 672
解法1:按行DFS,通过行差和列差的绝对值判定对角线
参考文献 《程序员代码面试指南》第2版,左程云
C++ 代码
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 11;
// st[i] = 行i的棋子所在列编号
int n, st[N];
void print_ans()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(st[i] == j) printf("Q");
else printf(".");
}
puts("");
}
puts("");
}
bool is_valid(int r, int c)
{
// 防止同列或对角线
for(int i = 1; i < r; i++)
{
if(st[i] == c || abs(i - r) == abs(c - st[i]))
return false;
}
return true;
}
void dfs(int k)
{
if(k == n)
{
print_ans();
return;
}
k++;
// 为当前行遍历每一列
for(int i = 1; i <= n; i++)
{
if(is_valid(k, i))
st[k] = i, dfs(k);
}
}
int main()
{
scanf("%d", &n);
memset(st, 0, N);
dfs(0);
return 0;
}