八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。(问题描述来自参考文献1)
思想我用的是搜索(本人大一,菜鸟一枚,呜呜呜)
上代码了,老北鼻们
#include<bits/stdc++.h>
using namespace std;
int ans=0;//答案总数
// 列 第一条斜线 第二条斜线
bool col[10], x1[20], x2[20]; //初始化是false
/*前说一下我对这两个斜线的理解,其实对于棋盘的某条斜线的点而言x+y其实和是定值*/
bool check(int r,int i) // 排查是否符合列和斜线是否符合唯一的规则
{
return !col[i]&&!x1[r+i]&&!x2[r-i+8];
}
void dfs(int r)// r:列
{
if(r==8)
{
ans++;
return ;
}
/*此处再谈一下我都理解,r是列那么for遍历的就是r列的每一行*/
for(int i=0; i<8; i++)
{
if(check(r,i)) //查看是否符合规则
{
col[i]=x1[r+i]=x2[r-i+8]=true;
dfs(r+1);
col[i]=x1[r+i]=x2[r-i+8]=false;
}
}
}
int main()
{
dfs(0);
cout<<ans<<endl;
return 0;
}