题目
思路
对角线 dg[u+i]dg[u+i],反对角线udg[n−u+i]udg[n−u+i]中的下标 u+iu+i和 n−u+in−u+i 表示的是截距
下面的(x,y)(x,y)相当于(u,i)(u,i)
(1)反对角线 y=x+by=x+b, 截距 b=y−xb=y−x,因为我们要把 bb 当做数组下标,所以 bb 不能是负的,所以我们 +n+n,保证是结果是正的
(2)而对角线 y=−x+by=−x+b, 截距是 b=y+xb=y+x,这里截距一定是正的,所以不需要加偏移量
注:
// bool数组用来判断搜索的下一个位置是否可行
// col列,dg对角线,udg反对角线
// g[N][N]用来存路径
#include<iostream>
using namespace std;
int n;
const int N = 20;
char g[N][N]; //存储路径
bool col[N], dg[N], udg[N]; // 判断列、对角线7反对角线是否可行
void dfs(int u)
{
if(u == n)
{
for(int i = 0; i < n; i ++) puts(g[i]);
puts("");
return;
}
for(int i = 0; i < n; i ++)
{
if(!col[i] && !dg[u + i] && !udg[n - u + i])
{
g[u][i] = 'Q';
col[i] = dg[u + i] = udg[n - u + i] = true;
dfs(u + 1);
col[i] = dg[u + i] = udg[n - 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);
return 0;
}