回溯法解八皇后

47 篇文章 4 订阅
16 篇文章 3 订阅
这篇博客探讨了如何运用回溯法来解决经典的8皇后问题,即在一个8×8的棋盘上放置8个皇后,使得每行、每列及两条对角线上均没有两个皇后互相攻击。博主提供了C语言的实现代码,并通过递归函数`Backtrack`来尝试放置皇后,同时检查当前位置的安全性。最终,程序成功输出了解的数量,即8皇后问题的全部解的个数92种。
摘要由CSDN通过智能技术生成
任务描述

本关任务:假设已放了8个皇后的棋盘(在每列、每行上只有一个皇后,且一条斜线上也只有一个皇后)。用回溯法解8个皇后问题的全部解。

编程要求

定义函数Try(i),用来试探放第i行上的皇后。
讨论将第i行上的皇后放在j列位置上的安全性,可以逐行地放每一个皇后,在做这一步时,第i行上还没有皇后,不会在行上遭到其他皇后的攻击。只考虑来自列和对角线的攻击。定义q(i)=j表示第i行上的皇后放在第j列,一旦这样做了,就要考虑第i个皇后所在的列不安全了,让C[j]=false,同时,要考虑通过(i,j)位置的两条对角线也不安全了,得出从左上到右下的对角线上的每个位置都有“i-j=常数”的特点;从左下到右上的对角线上的每个位置都有“i+j=常数”的特点。得出在(i,j)位置放皇后的安全条件为
nq=C[j]&&L[i-j+9]&&R[i,j]
假如,C[j],L[k], R[m]为布尔型

测试说明

平台会对你编写的代码进行测试:

预期输出:

92

C语言实现
#include<stdio.h>
#include<math.h>
int resultCount=0;//记录解的个数
int n=0;//皇后个数
int result[1000]={0};
int Place(int t){
    int re=1;
    //判断与前面的t-1个皇后位置是否冲突
    for(int i=0;i<t;i++){
        if(result[t]==result[i]||t-i==fabs(result[t]-result[i])){
            re=0;
            break;
        }
    }
    return re;
}

void Backtrack(int t){
    if(t>=n){
        resultCount++;
        //打印解
        // for(int i=0;i<n;i++){
        //     printf("%d  ",result[i]);
        // }
        // printf("\n");
        // printf("_______\n");
    }else{
        //求第t个皇后的可能行的位置
        for(int i=0;i<n;i++){
            result[t]=i;
            if(Place(t)){
                Backtrack(t+1);
            }
        }
    }

}


int main(void)  {
    //皇后个数为n
    n=8;
    Backtrack(0);//从零层开始递归
    //输出解
    printf("%d",resultCount);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高万禄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值