N皇后问题
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <stack> using namespace std; int map[50][50]; int a[11]; int m; int mark[3][50]; int n,ans,num; void dfs(int i) { if(i==n){ ans++; return ; } for(int j=0;j<n;j++){ if(!mark[0][j]&&!mark[1][i+j]&&!mark[2][i-j+n]) { mark[0][j]=1;mark[1][j+i]=1;mark[2][i-j+n]=1; dfs(i+1); mark[0][j]=0;mark[1][j+i]=0;mark[2][i-j+n]=0; } } } int main() { for(n=1;n<=10;n++){ ans=0; memset(mark,0,sizeof(mark)); dfs(0); a[n]=ans; } while(~scanf("%d",&n)&&n){ printf("%d\n",a[n]); } return 0; }
如果不先放在数组里会超时
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <stack> using namespace std; int map[50][50]; int a[11]; int m; int mark[3][50]; int n,ans,num; void dfs(int i) { if(i==n){ ans++; return ; } for(int j=0;j<n;j++){ if(!mark[0][j]&&!mark[1][i+j]&&!mark[2][i-j+n]) { mark[0][j]=1;mark[1][j+i]=1;mark[2][i-j+n]=1; dfs(i+1); mark[0][j]=0;mark[1][j+i]=0;mark[2][i-j+n]=0; } } } int main() { for(n=1;n<=10;n++){ ans=0; memset(mark,0,sizeof(mark)); dfs(0); a[n]=ans; } while(~scanf("%d",&n)&&n){ printf("%d\n",a[n]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。