N皇后问题 分类: ACM 2014-08-04 22:24 57人阅读 评论(0) 收藏

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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(ACM)