HDU - 2553 N皇后问题

#include <iostream>

using namespace std;

const int N=15;
int n,cnt;
int a[N],b[N],c[2*N],d[2*N],arr[N];//a,b,c,d四个数组是分别表示行,列和两条对角线,因为行,列最大为10,那么对角线数组就用2倍行,列存储

void dfs(int k)//k表示行数,i表示列数
{
    if(k==n+1)//如果行数等于边数+1(因为当行数等于边数指的是完成皇后安置,这时候进入边数+1,此时为结束时)
    {
        cnt++;//记录一共有多少种放法
    }
    for(int i=1;i<=n;i++)
    {
        if(!a[k]&&!b[i]&&!c[10+k+i]&&!d[10+k-i]) //为什么要10+k+i,10+k-i,保证这两个数(10+k+i,10+k-i)均大于等于0
                                                 //为什么10+k+i,10+k-i表示两条对角线,例如4*4的格子中,对于k=1,i=1时,10+k-i=10,那么这条对角线
                                                 //k=2,i=2时,10+k-i=10,你可以发现同样等于10,只有满足在这条对角线上的点,k-i始终等于0,所以10+k-i
                                                 //始终等于0;同理,10+k+i,表示另一条对角线上的点
        {
            a[k]=1,b[i]=1,c[10+k+i]=1,d[10+k-i]=1;
            dfs(k+1);
            a[k]=0,b[i]=0,c[10+k+i]=0,d[10+k-i]=0;
        }
    }
}

int main()
{
    for(n=1;n<=10;n++)
    {
        cnt=0;
        dfs(1);
        arr[n]=cnt;
    }//因为1到10值是固定的,且比如可能我一直输5,程序要不停地计算当n=5的时候,结果是多少,很可能超时,所以用一个arr数组保存
    int a;
    while(cin >> a && a)
    {
        cout << arr[a] << endl;
    }
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值