您的位置:首页 > 其它

ACM 搜索 HDU 2553 N皇后问题

2016-05-28 10:52 501 查看
[align=left]Problem Description[/align]
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

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

[align=left]Output[/align]
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

[align=left]Sample Input[/align]

1
8
5
0

 

[align=left]Sample Output[/align]

1
92
10

 

[align=left]Author[/align]
cgf
 

#include<stdio.h>  

#include<string.h>  

#include<stdlib.h>  

int n,ans;  

int map[15];  

int visit[15];  

int sol[15];  

void dfs(int k)  

{  

    int i,j,flag;  

    if(k==n+1)  

    {  

        ans++;  

        return;  

    }  

    for(i=1;i<=n;i++)  

    if(!visit[i])  //各行棋子不能在同一竖  

    {  

        map[k]=i;  

        flag=1;  

        for(j=1;j<=k-1;j++)  //判断是否在同一斜线上  

        if((map[k]-map[j])==(k-j)||(map[k]-map[j])==(j-k))  

        {  

            flag=0;  

            break;  

        }  

        if(flag)  

        {  

            visit[i]=1;  

            dfs(k+1);  

            visit[i]=0;  //释放第i列,进行下一次搜索  

        }  

    }  

}  

int main()  

{  

    int i;  

    for(i=1;i<=10;i++)  

    {  

        ans=0;  

        n=i;  

        memset(map,0,sizeof(map));  

        memset(visit,0,sizeof(visit));  

        dfs(1);  

        sol[i]=ans;  

    }  

    while(scanf("%d",&n),n)  

    printf("%d\n",sol
);  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: