对于八皇后问题,我们可以先假设三个数组c[], l[], il[]。其中c[]表示纵坐标数组,l[]表示左对角线,il[]表示右对角线。应为我们就是横向开始遍历的,所以不用定义横向数组了。
如图所示,我们可以发现左对角线的所有点的i - j都相等,右对角线的所有点的i + j都相等,不行的话可以试试,上代码。
#include<iostream>
using namespace std;
bool c[30] = {false}, l[30] = {false}, il[30] = {false}; //c表示纵向方向,l表示左对角线,il表示有对角线
int n;
int cnt = 0;
bool judge(int x, int y)
{
if(c[y] || l[y - x + n] || il[x + y])
return false;
return true;
}
void dfs(int x)
{
if(x == n)
{
cnt ++;
return;
}
for(int i = 1; i <= n; i++)
{
if(!judge(x, i))continue;
c[i] = true;
l[i - x + n] = true; //这里加n是为了防止出现负数
il[x + i] = true;
dfs(x + 1);
c[i] = false;
l[i - x + n] = false;
il[x + i] = false;
}
return;
}
int main()
{
cin >> n;
dfs(0);
cout << cnt << endl;
return 0;
}