八皇后问题(dfs)

八皇后问题,是一个古老而著名的问题,是搜索算法的经典案例。该问题是国际西洋棋棋手马克思贝瑟尔于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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章