图片描述
首先一元函数的表达式为y = x +/- b, 我们不难发现b值是一个常量,且b = +/-(y - x)
即一个b值就能代表对角线上所有的点,因此我们能够使用b值作为数组下标
其中的c为一个常量可以是任意大于或等于0的数
代码示例
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
const int c = 10000; //对角线可以加上一个任意常量,为了演示我这边开了一个比较大的数🫠
//y总在视频中用n作为常量是因为N只开了20个,
//因为题目给出的n是肯定小于我们的N的
char g[N][N];
int n;
bool col[N], dg[c], udg[c];
//dfs function
void dfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i ++ ) puts(g[i]); //这边不太懂为什么用puts函数只需要循环一层 🥹
cout << endl;
/*for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ ) cout << g[i][j];
cout << endl;
}
cout << endl;
*/
}
/*
开对角线添加的常量c的时候,
一定要注意常量c一定要小于数组开出的数
*/
for (int i = 0; i < n; i ++ )
if(!col[i] && !dg[u + i + 1000] && !udg[i - u + 1000])
{
g[u][i] = 'Q';
col[i] = dg[u + i + 1000] = udg[i - u + 1000] = true;
dfs(u + 1);
col[i] = dg[u + i + 1000] = udg[i - u + 1000] = 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;
}