八皇后问题 C&Py

八皇后

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。

C语言解法

你当然可以写8个for循环,但这不是蓝桥杯。

思路是这样的,每一行只能放一个皇后,这是这个问题的特点(当然每一列每一条斜线上都只能放一个皇后,这里我们放在检查部分讨论)

首先说一下步骤:

  1. 在这一行随便找个位置放下去
  2. 检查这个位置能不能放
  3. 检查到能放了,进行下一行位置的判断(也就是递归到第一步)
  4. 回溯,找这一行还有没有另一个位置能放

第四步乍一看可能想不通,因为我没有做一张直观的图出来,咱们看代码。

int cnt = 0;
int table[8] = {
   -1,-1,-1,-1,-1,-1,-1,-1};

cnt计数八皇后问题有多少个解
table数组表示第几行的第几列已经放置了皇后,若该行还未放置皇后,则为-1

void queen(int y)
{
   
    int x = 0;//x表示要放置棋子的位置
    if(y > 7)//如果第y行是最后一行
    {
   
        show();//打印棋盘
        cnt++;//解法+1
    }
    else{
   
        for(x = 0; x < 8; x++)//从y行的0号位开始放置一个棋子
        {
   
            if(check(x,y))//如果这个位置允许放置
            {
   
                table[y] = x;//保存这个位置
                queen(y+1);//去下一行寻找合适的位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值