数据结构与算法(Python)– 回溯法(Backtracking algorithm)


1、回溯法

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。采用的是深度优先搜索。


2、迷宫

题目: 一个 N × M的二维数组 maze 表示一个迷宫,其中的1表示墙壁,0表示可以走,只能横着走或竖着走,不能斜着走,找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的。

回溯法:

# 走迷宫
def move(i, j):global path# 当前点变为1,表示已经走过,避免循环绕圈走不出去maze[i][j] = 1temp_path.append((i, j))# 如果已经走到了出口,即右下角,判断是不是最短路径if i == N - 1 and j == M - 1:if len(path) == 0 or len(temp_path) < len(path):path = []path.extend(temp_path)# 向下走if 0 <= i + 1 < N and not maze[i + 1][j]:move(i + 1, j)# 向右走if 0 <= j + 1 < M and not maze[i][j + 1]:move(i, j + 1)# 向上走if 0 <= i - 1 < N and not maze[i - 1][j]:move(i - 1, j)# 向左走if 0 <= j - 1 < M and not maze[i][j - 1]:move(i, j - 1)# 如果上下左右都走不通或者已经走到出口了,退回上一步,恢复现场temp_path.pop()maze[i][j] = 0while True:try:# 输入迷宫大小N, M = map(int, input().split())maze = []path = []temp_path = []# 输入迷宫地图for _ in range(N):maze.append(list(map(int, input().split())))# 走迷宫move(0, 0)# 打印路径for p in path:print('(' + str(p[0]) + ',' + str(p[1]) + ')')except:break

3、数独

题目: 根据9X9网格上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3网格内的数字均含1-9,并且不重复。

回溯法:

# 检查该位置填该数字是否满足要求
def check(m,n,e):# 检查行if e in s[m]:return False# 检查列if e in s_T[n]:return False# 检查3X3网格x=m//3*3y=n//3*3for i in range(x,x+3):for j in range(y,y+3):if s[i][j]==e:return Falsereturn True# 填数字
def move(k):if k==81:return 0# 从左到右,从上到下遍历每一格row,col=k//9,k%9# 如果是该格为空if s[row][col]=='0':# 从1~9依次尝试for e in num:# 如果该数满足要求,该格填上该数if check(row,col,e):s[row][col]=es_T[col][row]=e# 移到下一格。如果下一格不管填什么都不满足要求,恢复现场if move(k+1):s[row][col]='0's_T[col][row]='0'else:return 0# 如果1~9都不满足,返回1return 1else:if move(k+1):return 1while True:try:# 输入s=[input().split() for i in range(9)]s_T=[[s[i][j] for i in range(9)] for j in range(9)]num=['1','2','3','4','5','6','7','8','9']# 填数字move(0)# 打印for i in range(9):print(' '.join(s[i]))except:break

GOOD LUCK!


数据结构与算法(Python)– 回溯法(Backtracking algorithm)相关推荐

  1. 回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)

    转载自:用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle) N皇后问题 八皇后问题,是一个古老而著名的问题.该问题是国际西洋棋棋手马克斯·贝瑟尔于 ...

  2. 《数据结构与算法 Python语言描述》 读书笔记

    已经发布博客 <数据结构与算法 Python语言描述> 读书笔记 第二章 抽象数据类型和Python类 2.1 抽象数据类型abstract data type:ADT 2.1.1 使用编 ...

  3. 分油问题回朔法c语言算法,用回溯法求“韩信分油”问题所有解

    裴南平 摘要:回溯法是一种常用的计算机程序设计方法.使用回溯法解决"韩信分油问题"也称"泊松分酒问题",在算法中保存每一步执行的中间结果,程序扩展前,判斷程序是 ...

  4. 数据结构python课后答案_数据结构与算法:Python语言描述 1~5章课后习题

    数据结构与算法:Python语言描述 1~5章课后习题 发布时间:2018-07-19 20:42, 浏览次数:1885 , 标签: Python MarkDown语法写的,不知道为啥上传到CSDN不 ...

  5. C++——《算法分析与设计》实验报告——贪心算法与回溯法

    实验名称: 贪心算法与回溯法 实验地点: 实验目的: 1.理解贪心算法与回溯法的概念: 2.掌握贪心算法与回溯法的基本要素: 3.掌握贪心算法与回溯法的解题步骤与算法柜架: 4.通过应用范例学习贪心算 ...

  6. mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

    数据结构与算法Python版-中国大学mooc-试题题目及答案 更多相关问题 婴儿出生一两天后就有笑的反应,这种笑的反应属于(). [判断题]填制原始凭证,汉字大写金额数字一律用正楷或草书书写,汉字大 ...

  7. 递归算法(三)- 回溯法Backtracking

    回溯法 回溯法Backtracking(找所有的可能)递归: 类似枚举,一层一层向下递归,尝试搜索答案. 找到答案: => 返回答案,并尝试别的可能 未找到答案: => 返回上一层递归,尝 ...

  8. LeetCode算法总结-回溯法与深度优先搜索

    转载自  LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...

  9. C++——《算法分析》实验叁——贪心算法与回溯法

    实验目的: 1.理解贪心算法与回溯法的概念: 2.掌握贪心算法与回溯法的基本要素: 3.掌握贪心算法与回溯法的解题步骤与算法柜架: 4.通过应用范例学习贪心算法与回溯法的设计技巧与策略: 实验原理 1 ...

  10. 五大经典算法之回溯法

    一.基本概念   回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. ...

最新文章

  1. WCF后续之旅(16): 消息是如何分发到Endpoint的--消息筛选(Message Filter)
  2. 【转】从3个科技公司里学到的57条经验
  3. 一 Struts2 开发流程
  4. 机器学习模型,能分清川菜和湘菜吗?
  5. html 判断是苹果几个版本号,这是我第一次遇到判断ios系统版本的问题
  6. word通配符使用法详解
  7. C++:15---异常机制
  8. Linux运维常见问题解决集锦【转】
  9. 停止、启动或重新启动 VMware vCenter Server Appliance 6.x 及更高版本上的服务 (2109887)
  10. 云服务 华为p10 短信_苹果、小米、华为,手机云服务哪家强?
  11. 基于SSM的校园帮系统
  12. windows远程连接linux中mysql数据库
  13. Ftp、Ftps与Sftp之间的区别
  14. 2022年N1叉车司机考试题及N1叉车司机理论考试
  15. nas设备在通用服务器的基础上对文件服务,NAS网络存储设备将取代文件服务器
  16. aspose-cells-8.52问题记录,excel转pdf,字体,格式
  17. 升级bigsur_2年内彻底摆脱英特尔,苹果重磅发布自研Mac芯片,并对“五大系统”再升级...
  18. 总结了一套比较新的面试题挺全面的,多方面都有涉及到
  19. NAR|北大/中科院计算所团队发布基因功能富集分析平台KOBAS-i
  20. 彻底解决CUDA安装_ 被坑的几个要点

热门文章

  1. 09_Redis持久化——AOF方式
  2. jquery 如何保存拖动空间的位置
  3. zabbix配fpmmm(mpm)数据传送不了问题解决
  4. JavaScript拖拽
  5. MY_Log,无缝替换原生Log,支持日志输出到文件、FirePHP
  6. 一条sql语句,要修改一个字段的俩个值,比如把字段sex中的男改为女,女改为男...
  7. python面向编程:类继承、继承案例、单继承下属性查找、super方法
  8. BASIC-1_蓝桥杯_闰年判断
  9. python--8、面向对象的深入知识
  10. PHP扩展-扩展的生成和编译