深搜--n皇后问题 hdu2553

解决N皇后问题与对角线标记优化
本文探讨了N皇后问题的实现方法,并详细解释了如何通过优化对角线标记数组避免越界错误,最终通过实例展示了如何避免TLE(超出时间限制)的方法。

遇到的问题:one之前写了八皇后,对于n皇后的对角线问题一直有问题。但是仔细都列出来找了一下规律之后觉得其实蛮简单的。关键是对角线标记数组要开大一点,避免越界。  two都对了之后结果TLE,最后在帮助下打了个表,顺利通过啦。。

思路:行不需要标记,从0循环到n-1,一种方法的递归结束条件是行循环到了n-1,只要列标记和对角线标记。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int n;
int sum;
int r[15],d1[35],d2[35],a[11];//d1和d2数组分别是两个对角线数组,注意要开得大一些,题目只有到10,所以35差不多啦
void dfs(int k){
    if(k==n){
        sum++;
        return ;
    }
    for(int i=0;i<n;i++){
        if(!r[i]&&!d1[i+k]&&!d2[i-k+n-1]){
            r[i]=1;
            d1[i+k]=1;
            d2[i-k+n-1]=1;
            dfs(k+1);
            r[i]=0;
            d1[i+k]=0;
            d2[i-k+n-1]=0;//对角线这个规律不是唯一的
        }
    }
}
int main(){
    for(n=1;n<=10;n++){
        memset(r,0,sizeof(r));
        memset(d1,0,sizeof(d1));
        memset(d2,0,sizeof(d2));
        sum=0;
        dfs(0);
        a[n]=sum;
    }//这步避免的TLE
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        cout<<a[n]<<endl;
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/wsyxy/p/4278168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值