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);
}
 

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