`
brandNewUser
  • 浏览: 457055 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法学习-回溯法

阅读更多
 
八皇后问题是一个以国际象棋为背景的问题,如何在8*8的棋盘上放置8个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。其实8皇后问题也可以推广为更为一般的n皇后问题,棋盘大小变为n*n,当n=2或者3时,是不存在解的,问题的限制有:
 
  • 所有的皇后都不能在同一行或同一列,也就是说每行或每列都只能存在一个皇后;
  • 所有的皇后都不能在对角线上,假设两个皇后的坐标为(i, j)和(k, l),明显当且仅当|i-k|=|j-l|时,两个皇后在一个对角线上。
 
回溯法是穷尽搜索算法的一种,采用试错的思想,尝试分步骤去解决一个问题,在分步解决问题的时候,当尝试不能得到有效的解答时,取消上一步或上几步的计算,通过其他可能的分步去得到可能的答案。
 
八皇后问题使用回溯法解决的思想是,假设某一行为当前状态,不断检查该行所有位置能否放置一个皇后:
 
  • 从一行中的第一个位置开始检查,如果不能放置,接着检查该行的第二个位置,依次检查下去,直到在该行中能够找到一个可以放置一个皇后的位置,然后保存该状态,转到下一行重复该步骤;
  • 如果检查了该行中的所有位置都不能放置一个皇后,说明上一行皇后放置的位置无法让所有的皇后找到自己的位置,需要回溯到上一行,继续将上一行中的皇后位置后移,直到找到合理的位置为止;
 
'''print current status'''
def print_current_status(queen):
    print "----new-result--"
    for i in range(0, max):
        line = ""
        for j in range(0, max):
            if queen[i] != j:
                line += "-"
            else:
                line += "*"
        print line

'''judge that whether the n position can place here'''
def can_place(n, queen):
    for i in range(0, n):
        if queen[i] == queen[n] or abs(queen[i] - queen[n]) == abs(i - n):
            return False
    return True

'''recursive execute n queen problem'''
def n_queen(n, queen):
    for i in range(0, max):
        queen[n] = i
        if can_place(n, queen):
            if n == max - 1:
                print_current_status(queen)
            else:
                n_queen(n + 1, queen)


if __name__ == '__main__':
    queen = [0 for i in range(max)]
    n_queen(0, queen)
 
 
其中核心的方法就是n_queen方法,方法接收的第一个参数就是当前已经遍历到了第n行,顺序地将第n行尝试0~max,如果期间有合适的,递归看一下n+1行是否可行;如果已经到了最后一行,就直接将数据结果输出,这就是其中的一个解;如果探索所有的可能解之后没有正确的结果,回溯至上一层,最多可能遍历8*8次(在max=8的情况下)。
 
 
其中的一个结果数据类似(*表示皇后位置)如下所示:
*-------
----*---
-------*
-----*--
--*-----
------*-
-*------
---*----
 
分享到:
评论

相关推荐

    n皇后问题--回溯法实验

    **回溯法是一种在搜索解决问题时采用的有效算法,它通过尝试所有可能的解来找到问题的解决方案。在“n皇后问题”中,我们要在n×n的棋盘上放置n个皇后,使得任意两个皇后都无法互相攻击,即任何两个皇后都不在同一行...

    哈工程本科算法实验-0-1背包(动态规划-分支限界-回溯法)

    在哈工程的本科算法实验中,0-1背包问题是一个重要的学习内容,它涉及到动态规划、分支限界和回溯法这三种不同的算法解决策略。这些方法都是在处理优化问题时,尤其是面对有限资源和多种选择的情况下,寻找最优解的...

    (动态规划-分治法-贪心法-回溯法)算法练习题

    本资源汇集了动态规划、分治法、贪心法、回溯法四种算法的练习题,涵盖了矩阵连乘、最长公共子序列、背包问题、最大子段和、递归与分治法、Fibonacci 数列、全排列问题、棋盘覆盖问题、线性时间选择和循环赛日程表等...

    迷宫-回溯法改进(优先级算法)

    本话题聚焦于使用回溯法的改进版本——优先级算法来解决迷宫问题。回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,如果在某一步发现无法得到正确结果,则会撤销这一步,退回上一步,尝试其他可能的...

    西南交通大学-作业6-回溯法和黑白格和数独.docx

    通过本次作业的学习,不仅掌握了如何利用回溯法解决数独问题,还深入理解了算法的设计原理及其实际应用过程。在实践中,我们不仅需要关注算法的效率,还需考虑如何优化算法以提高解决问题的能力。

    算法分析之回溯法算法框架课件

    "算法分析之回溯法算法框架课件" 该课件主要介绍了回溯法算法框架的基本概念、原理和应用。...该课件为学习回溯法算法框架提供了一个系统的资源,幫助学生更好地理解和应用回溯法来解决组合优化问题。

    回溯法(ACM程序设计,算法竞赛)

    在学习回溯法的过程中,可以从简单的练习开始,例如经典的N皇后问题,逐渐过渡到更复杂的题目,例如带有各种约束的背包问题。通过这样的逐步训练,可以提高对回溯法的理解和应用能力。而"3回溯法"这个文件可能包含了...

    0-1背包问题(回溯法)报告.doc

    0-1背包问题是一个经典的组合优化问题,常用于资源有限情况下的最优决策...总的来说,这个实验报告详尽地介绍了0-1背包问题的回溯法解决方案,包括问题定义、算法设计、实验步骤和结果验证,是一份很好的学习参考资料。

    动态规划算法+贪心算法+回溯法实验文档

    总的来说,这份实验文档通过实例分析和代码实现,深入浅出地介绍了动态规划、回溯法和贪心算法的核心概念,对于学习者来说,是一个很好的实践平台,有助于提升对这些高级算法的理解和应用能力。

    回溯法:从入门到精通

    学习回溯法,首先要明白它的基本概念和工作原理。回溯法通常包括三个主要步骤:定义解空间、确定搜索顺序以及设置剪枝函数,以避免无效的搜索。 1. **解空间**:回溯法解决问题时,所有可能的解组成一个解空间。...

    java算法 0-1 背包问题回溯算法解决 netbeans

    通过阅读这份报告,学习者可以更好地理解回溯算法如何应用于0-1背包问题,同时也能对比贪心算法的差异,进一步了解两种算法的优缺点。 总的来说,这个资源为学习者提供了一个实践平台,通过NetBeans开发环境可以...

    中科大 算法导论 课件(全套11)回溯法

    ### 中科大 算法导论 课件... - **通过应用范例学习回溯法的设计策略**。 通过对上述知识点的学习,学生可以深入理解回溯法的工作原理及其在解决复杂组合问题中的应用,为进一步研究更高级的搜索算法奠定坚实的基础。

    算法代码(回溯法,动态规划,分治法,贪心)

    这个压缩包文件包含了四种基本的算法实现:回溯法、动态规划、分治法和贪心算法。这些都是计算机科学中极其重要的概念,对于理解和解决复杂问题至关重要。 1. **回溯法**:回溯法是一种试探性的解题策略,它尝试...

    动态规划法和回溯法求0-1背包问题

    回溯法是一种基于试探性搜索的算法,它通过不断地探索和回退来寻找问题的解。在解决0-1背包问题时,回溯法采用的是深度优先搜索策略,同时利用限界函数来剪枝,避免无效的搜索路径。 - **解空间树**:0-1背包问题的...

    青蛙换位游戏算法实现C++ 回溯法

    青蛙换位游戏是一种经典的逻辑推理问题,通常出现在计算机科学中的算法设计与分析课程中,用于教授学生如何使用回溯法来解决复杂问题。在这个游戏中,有一排数字,我们需要通过一系列合法的操作将它们重新排列,使得...

    算法设计与分析 回溯法

    回溯法是一种重要的算法设计策略,常用于解决复杂的问题,如搜索、组合优化和逻辑推理等。它通过尝试所有可能的解空间分支来寻找问题的解,当发现某一分支无法得到有效解时,会“回溯”到上一步,尝试其他分支。这种...

    南京邮电大学 算法设计与分析 陈慧南 实验三回溯法实验报告

    ### 南京邮电大学 算法设计与分析 陈慧南 实验三回溯法实验报告 #### 实验目的 本次实验旨在通过实践掌握并深入理解回溯法的基本原理及其应用。具体目标包括: - 学习如何通过编程实现深度优先搜索状态空间树来...

    回溯法解决图着色(PPT+代码(C++))

    回溯法是一种强大的算法,常用于解决约束满足问题,如迷宫求解、数独填数、...通过学习这个资源,你不仅可以了解回溯法解决图着色问题的思路,还能掌握如何用C++编程实现。这对你深入理解算法、提高编程能力大有裨益。

    算法与分析实验四:回溯法

    回溯法是一种试探性的搜索策略,它用于在解决问题时尝试所有可能的解决方案,直到找到一个可行的解或者确定没有解...通过这个实验,学生能够更好地理解和掌握回溯法,并识别出在实际应用中的不足,为后续学习打下基础。

Global site tag (gtag.js) - Google Analytics