HDU 2553 N皇后问题

来源:互联网 发布:哈登 nba数据 编辑:程序博客网 时间:2024/06/07 01:45
A - N皇后问题
Crawling in process...Crawling failedTime Limit:1000MS    Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
SubmitStatus Practice HDU 2553

Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input

1850
 

Sample Output

19210


思路:本题用DFS算法,主要为在其中把每个点的每一条斜线和竖线进行标记。如果光这样的话会超时,所以要把这些点都提前存一下。
AC代码:
#include<cstdio>
#include<cstring>
int map[12];
int cnt,n;
void dfs(int cur)
{
    bool flag;
    int i,j;
    if(cur==n+1)
    {
        cnt++;
        return ;
    }
    for(i=1; i<=n; i++)
    {
        map[cur]=i;
        flag=true;
        for(j=1; j<cur; j++)
        {
            if(map[j]==i||map[j]-j==i-cur||map[j]+j==i+cur)
            {
                flag=false;
                break;
            }
        }
        if(flag)
            dfs(cur+1);
    }
}
int main()
{
    int m,a[12];
    for(n=1; n<=10; n++)
    {
        cnt=0;
        dfs(1);
        a[n]=cnt;
    }
    while(scanf("%d",&m),m)
    {
        printf("%d\n",a[m]);
    }
    return 0;
}
0 0
原创粉丝点击