八皇后问题(dfs)

与世无争的帅哥 提交于 2020-03-08 02:43:25

八皇后问题,是一个古老而著名的问题,是搜索算法的经典案例。该问题是国际西洋棋棋手马克思贝瑟尔于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;
} 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!