八皇后问题C语言题解

~~做了很多次

终于做出来了!!!!!!!!!!

解题思路:显然问题的关键在于如何判定某个皇后所在的行,列,斜线上是否有别的皇后

可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列好相同;如果同在/斜线上,则行列值之和相同;如果同在\斜线上,则行列值之差相同;下图可验证:
在这里插入图片描述
考虑每行有且仅有一个皇后,设一维数组a[1…8]表示皇后的放置:第i行皇后放在第j列,用a[i]=j来表示,即下标是行数,内容是列数。例如:a[3]=5就表示第3个皇后在第3行第5列上。
判断皇后是否安全,即检查同一列、同一对角线是否已有皇后,建立标志数组b[1…8]控制同一列只有一个皇后,若两皇后在同一对角线上,则其行列坐标之和或行列坐标之差相等,故亦可建立标志数组c[i…6]、d[-7…7]控制同一对角线上只能有一个皇后。
如果斜线不分方向,则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同。在这种方式下,要表示两个皇后i和j不在同一列或斜线上的条件可以描述为:(a[i]!=a[j])&&(abs(i-j)!=abs(a[i]-a[j])){i和j分别表示两个皇后的行号}
注意事项:注意题目就行

#include
int N,k,sum=0;  
int flag1[200]={0};  
int flag2[200]={0};  
int flag3[20]={0};  
int a[20]={0};  
void DFS(int i)  
{  
    if(i==N+1)  
    {  
        sum++;  
        if(sum<4)  
        {  
           for(int k=1;k<=N;k++)  
              printf("%d ",a[k]);  
           printf("\n");  
        }  
    }  
    else{  
        for(int j=1;j<=N;j++)  
           if(flag1[i+j]==0&&flag2[i-j+N]==0&&flag3[j]==0)  
           {  
             a[i]=j;  
             flag1[i+j]=1;flag2[i-j+N]=1;flag3[j]=1;  
             DFS(i+1);  
             flag1[i+j]=0;flag2[i-j+N]=0;flag3[j]=0;    
        }  
    }  
}  
int main()  
{  
    scanf("%d",&N);  
    DFS(1);  
    printf("%d\n",sum);  
}

拜拜了您嘞(QuQ)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值