使用回溯算法求解N皇后问题

文章目录N皇后问题描述回溯算法简介回溯算法对问题的要求回溯算法的思想回溯算法的模板使用回溯算法求解N皇后问题N皇后问题描述在一个N * N的国际象棋棋盘上需要放置N个皇后,放置时要保证这些皇后不能攻击彼此,也就是要保证在同一行、同一列、同一斜线上都只有一个皇后。该问题要求求出所有满足要求的放置方案。回溯算法简介回溯算法对问题的要求当一个问题满足:多步:需要多步来完成多选:每一步有...
摘要由CSDN通过智能技术生成

N皇后问题描述

在一个N * N的国际象棋棋盘上需要放置N个皇后,放置时要保证这些皇后不能攻击彼此,也就是要保证在同一行、同一列、同一斜线上都只有一个皇后。该问题要求求出所有满足要求的放置方案。

8皇后

回溯算法简介

回溯算法对问题的要求

当一个问题满足:

  1. 多步:需要多步来完成
  2. 多选:每一步有多种决策选择,并且你无法预见哪个选择会使你得到解,哪个选择会使你得不到解
  3. 瞻前:后续步骤会依赖于先前步骤的选择

这个问题就可以用回溯算法来解决。

拿求解迷宫路径的问题进行比对:

  • 要求1:寻找迷宫路径时,每一步操作就确定路径上的一个点,需要多步来确定一条完整的路径
  • 要求2:当你在当前步骤确定路径的下一个节点时,你可能有很多节点可选,并且你不知道选哪个节点才是可以求得最终解的
  • 要求3:你在当前步骤的候选节点是由你之前步骤确定的路径决定的

所以求解迷宫问题可以通过回溯算法来解决。读者可以怎么样可以让N皇后问题也符合回溯算法的要求,没有思路可以看下文使用回溯算法求解N皇后问题”的部分

回溯算法的思想

回溯算法用到的思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试,以此来把所有的可能性都考虑一遍。总结起来也就是深度优先搜索。

回溯算法的模板

回溯算法是由递归函数实现的,这个递归函数的基本骨架如下:

void backtrack(resultStack, arg1, arg2, ...){
   
    // 当满足题目的某种要求时,说明此时找到了问题的一个解
    if (some condition){
   
        // 在这里根据题目要求做出相关操作
        // 这里的操作一般是将resultStack复制一份,加入到所有解的集合中
        some operations;
        
        // 直接返回
        return;
    }
    
    // candidates 表示"要求2"中提到的多种候选决策
    // 在这里通过for循环遍历所有的候选决策
    for (candidate : candidates){
   
        // 当候选条件不符合要求时,跳过这个条件
        if (candidate does not satisfy some requirements){
   
            continue;
        }
        
        // 下面三行是这个函数的核心,体现了回溯算法能进则进的思想
        // 先把当前候选条件加入结果栈中,然后进入下一步,
        // 从下一步中返回后,将当前候选条件出栈,把结果栈恢复到之前的状态,
        // 以便考虑下一个candidate(for循环的下一个元素)
        resultStack.push(candidate);
        backtrack(resultStack, arg1, arg2);
        resultStack.pop(
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值