HDU 2553 N皇后问题

来源:互联网 发布:工程机械行业数据 编辑:程序博客网 时间:2024/05/09 07:18

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553

                                                                                                               N皇后问题

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

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

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 
Sample Input
1850
 
Sample Output
19210
 分析:题目意思就是在某一行的某一列放置一个皇后,然后在他的同一行,同一列以及45°对角线都不能放置皇后,求存在多少种放置方案。所以的话,我的思路就是用从第一行开始遍历,用一个数组id[i]表示第i行的皇后放置在哪一列。由于我是按行遍历的,因此在考虑当前行当前列是否可以放置的时候,只需要考虑是否同一列或者在45°对角线上,同一列的问题,可以考虑cur行之前的放置情况,用id[cur]与id[i]来判断,cur表示当前行;对角线的问题,很容易可以发现,判断它们斜率的绝对值是否等于1(紫书上也有一种判断方法,菜鸟没看懂,只能用自己的方法来判断),如果可以放置,则进行cur+1行的操作,直到n-1行,否则考虑另一列。判断一套方案是否成立的条件是cur==n。下面代码用了预处理的方法~
下面上代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;int id[12];int n;int count1;int a[12];void dfs(int cur,int t){    if(cur==t)    {        a[t]++;    }    else    {        for(int i=0;i<t;i++)        {            id[cur]=i;            int flag=1;            for(int j=0;j<cur;j++)            {                if(id[cur]==id[j]||abs(cur-j)==abs(id[cur]-id[j]))                {                    flag=0;                    break;                }            }            if(flag==1)                dfs(cur+1,t);        }    }}int main(){    memset(a,0,sizeof(a));    for(int i=1;i<=10;i++)    {        dfs(0,i);    }    while(~scanf("%d",&n)&&n)    {        printf("%d\n",a[n]);    }    return 0;}

0 0
原创粉丝点击