杭电--2553 N皇后问题

本题链接:点击打开链接

 

N皇后问题

 

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22817    Accepted Submission(s): 10157

 

 

Problem Description

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

 

 

Input

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

 

 

Output

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

 

 

Sample Input

 

1 8 5 0

 

 

Sample Output

 

1 92 10

 

 

Author

cgf

 

 

Source

2008 HZNU Programming Contest

 

 

Recommend

lcy   |   We have carefully selected several similar problems for you:  2614 1258 1045 1426 1035 

 


解题思路:题意就不说了,大家都懂,这里我和大家再提一下经典的八皇后问题,很多参考书上都有,上面说了所有符合条件的放置方法,都恰好满足每行每列各放置一个皇后。这里我们用 a[x] 表示第 x 行皇后的位置(也就是其列编号)。但为了节省时间,我们还是选择打表的方法。

 

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int a[11];          //第i个皇后放在第i行的第a[i]位
int c[11]={0};          //存放10以内满足条件的次数
int m,n,s;
bool ok(int x)
{
    for(int i=1; i<x; i++)
        if(a[x]==a[i] || abs(a[x]-a[i])==x-i)  //列和对角线不能重复
            return 0;
    return 1;

}
void dfs(int x)
{
    if(x==m+1)
        s++;
    for(int i=1; i<=m; i++)
    {
        a[x]=i;
        if(ok(x))
        dfs(x+1);
    }
}
int main()
{
    for(int i=1; i<11; i++)     //本题这样做必须打表,不然会超时。
    {
        m=i;
        s=0;
        dfs(1);
        c[i]=s;
    }
    while(~scanf("%d",&n)&&n)
       {
        printf("%d\n",c[n]);
       }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值