费欣宇 2021-12-20 11:20 采纳率: 84.6%
浏览 19
已结题

n皇后问题,n大于9无结果

如题,程序输入n个皇后的n,输出有多少种情况(不考虑重复),此段代码从9开始没有结果,我想知道没有结果的原因

#include<stdio.h>
#include<string.h>
#include<stdbool.h>
int a[20],count=0;
bool check(int a[],int x){//判断前x行是否满足皇后不能互相攻击,x为检查到第几行
int i,j;
for(i=1;i<=x;i++){
        for(j=1;j<i;j++){
            if(a[j]==a[i]) return false;
            if(a[j]-j==a[i]-i) return false;
            if(a[j]+j==a[i]+i) return false;
        }
}
return true;
}
void bahuanghou(int x,int n){//x为a[i]中的i(也就是行),x代表进行到第几行了,n为n皇后
if(a[1]>n) return;//要想象最后一种情况时会如何作为结束条件
else if(a[x]>n){
    a[x-1]++;
    a[x]=1;
    bahuanghou(x-1,n);
}//先判断如果列超界,退行并重置列
else{//尤其注意此处else与上面的关系
if(x==n){
    if(check(a,x)){
        count++;
    }
}//如果已经放置了n个皇后(皇后个数满了),看看它是否需要计数
if(check(a,x)&&x!=n)//不管上面记不记数都进行如下操作
    bahuanghou(x+1,n);//如果皇后未满且皇后都不能互相攻击,进行下一行
else{
    a[x]++;
    bahuanghou(x,n);
    }//皇后能互相攻击,换列并重新进行该行
}
}
int main(){
int i;
for(i=0;i<=19;i++){
    a[i]=1;
}
scanf("%d",&i);
bahuanghou(1,i);
printf("%d\n",count);
}
 

  • 写回答

1条回答 默认 最新

  • 於黾 2021-12-20 11:27
    关注

    运算次数是随皇后数量指数递增的,你确定程序执行完了没结果吗,还是花了好久好久根本没有执行完呢
    把所有皇后遍历的丢进数组里效率是非常低的
    你想皇后不攻击,那么至少要保证每行每列都只能有一个皇后,然后再判断都不在同一条斜线上即可
    那么你放置皇后的时候,第一行只能放一个,第二行也只能放一个,且列号不能与第一行相同,以此类推,写个递归就可以放好n行了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 创建了问题 12月20日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测