hdu N皇后问题
此题是很基本的dfs的题目 ,但是要打表,否则会超时。
这题的思路就是从第一行一直放到第n行,因此行方面的判断就可以省略了。因此只要判断列方面和斜线方面是否满足条件,列方面用一个vis数组来记录是否已放过皇后就可以了,
斜线上只要判断abs(k-j)是否等于(maze[k]-maze[j])就可以了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include"iostream" #include"stdio.h" #include"string.h" #include"string" #include"algorithm" #include"cmath" #define mx 105 using namespace std; int n,Count; int maze[mx]; int vis[mx]; int solve[mx]; void dfs(int k) { int i,j,flag; if(k==n+1) { Count++; return; } for(i=1;i<=n;i++) { if(!vis[i]) { maze[k]=i; flag=1; for(j=1;j<=k-1;j++)//判断是否在同一个斜线上 { if(abs(k-j)==abs(maze[k]-maze[j])) { flag=0;break; } } if(flag) { vis[i]=1; dfs(k+1); vis[i]=0; } } } } int main() { for(int i=1;i<=10;i++) { Count=0; memset(vis,0,sizeof(vis)); memset(maze,0,sizeof(maze)); n=i; dfs(1); solve[i]=Count; } while(cin>>n,n) { cout<<solve[n]<<endl; } return 0; }