八皇后问题,是一个古老而著名的问题,是搜索算法的经典案例。该问题是国际西洋棋棋手马克思贝瑟尔于1848年提出:在8*8格的国际象棋上摆放八个皇后。使其不能相互攻击,即任意两个皇后都不能处于同一行、同一列或者同一斜线,问有多少中摆法。
分析:用dfs一行一行得进行摆放,用for循环来确定每一列,由于是一行一行得摆放所以不可能同行,我们只需要标记同列,同对角线,就行,会发现主对角线一条对角线上的行列和等于同一个常数,副对角线一条对角线行列差等于一个常数,只不过会是负数,防止下标是负数我们可以进行+8,保证是一个正数,利用这个性质来确定有没有同行同列
#include<iostream>
using namespace std;
bool v[10],tx[20],ty[20];//表示这一列,主对角线,负对角线有没有皇后
int cnt=0;
bool check(int x,int y){
return !v[y]&&!tx[x+y]&&!ty[x-y+8];//+8防止产生负数
void dfs(int x){
if(x==8){//找到了一种摆法
cnt++;
return;
}
for(int i=0;i<8;i++){
if(check(x,i)){
v[i]=tx[x+i]=ty[x-i+8]=true;
dfs(x+1);
v[i]=tx[x+i]=ty[x-i+8]=false;
}
}
}
int main(){
dfs(0);//从0行开始摆放;
cout<<cnt<<endl;
return 0;
}
来源:CSDN
作者:Knock man
链接:https://blog.csdn.net/Anterior_condyle/article/details/104614319