N皇后问题是DFS的代表性问题,其最难的地方就是在判重这里,想明白了怎么判重的话问题就很显然了。
这里给出两份代码,其中第一份代码的效率更好,就是在判重上下了功夫。当然,我记得还有使用位运算进行判重的方法,这里就先不介绍了。
首先是第一份代码,二维数组直接进行判重。
1 #include<iostream> 2 using namespace std; 3 int n,ans=0; 4 int a[1005],v[5][1005]; 5 void dfs(int dp) 6 { 7 if(dp>n) 8 { 9 ans++; 10 return; 11 } 12 for(int i=0;i<n;i++) 13 if(!v[0][i]&&!v[1][dp+i]&&!v[2][dp-i+n]) 14 { 15 v[0][i]=v[1][dp+i]=v[2][dp-i+n]=1; 16 dfs(dp+1); 17 v[0][i]=v[1][dp+i]=v[2][dp-i+n]=0; 18 } 19 } 20 int main() 21 { 22 cin>>n; 23 dfs(1); 24 cout<<ans; 25 return 0; 26 }
第二份代码的判重思路还是很容易看懂的,只不过效率不如第一份代码的好。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 const int maxn=15; 6 int n; 7 int ans=0; 8 int c[maxn]; 9 bool check(int x) 10 { 11 for(int i=1;i<x;i++) 12 { 13 if(c[x]==c[i]||x-c[x]==i-c[i]||x+c[x]==i+c[i]) 14 return false; 15 } 16 return true; 17 } 18 void dfs(int dp) 19 { 20 if(dp>n) 21 { 22 ans++; 23 return; 24 } 25 for(int i=1;i<=n;i++) 26 { 27 c[dp]=i; 28 if(check(dp)) 29 dfs(dp+1); 30 c[dp]=0; 31 } 32 } 33 int main() 34 { 35 cin>>n; 36 dfs(1); 37 cout<<ans<<endl; 38 return 0; 39 }