八皇后問題(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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章