1. 程式人生 > >資料結構之圖論之深度搜索之八皇后

資料結構之圖論之深度搜索之八皇后

//八皇后問題
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
int a[100],count,n;
bool check(int a[],int k)
{
	for(int i=1;i<k;i++)
		if((abs(a[k]-a[i])==k-i)||(a[k]==a[i]))
			return false;
	return true;
} 

void dfs(int k)
{
	if(k>n){
		for(int i=1;i<9;i++)
			cout<<a[i]<<"";
			count++;
		cout<<endl;
	}else{
		for(int i=1;i<=8;i++){
			a[k]=i; 
			if(check(a,k))
				dfs(k+1);
		}
				
	}
}
int main()
{
	n=8;count=0;	
	dfs(1);
	cout<<count<<endl;
	return 0;
}

dfs大法好!

來梳理一下DFS的思路:

1、建立一個數組:存放要列印的方案。

2、建立dfs遞迴:判斷遞迴結束條件

                            for迴圈遍歷一下,看看是否可以進行深層遞迴(一般結合狀態函式)

                           回溯

再來梳理一下本題思路:

1;由於本題的特殊性:一維陣列存放方案(a[ 5  ]=2表示在第六行第二列存放)

2;判斷遞迴結束條件(本題的結束條件比較複雜,所以不選擇使用狀態陣列,而使用一個函式來判斷)

3;關於回溯的問題,好好看一下程式碼,會清楚的。