--- 骑士周游问题 ---在国际象棋棋盘上,一个"骑士"按照"马走日"的规则从一个格子出发,走遍所有棋盘格恰好一次,即为一次周游思路 (深度优先 - Depth First Search (DFS)):1. 将合法走棋次序表示为一个图1)将棋盘格作为顶点2)按照"马走日"规则的走棋步骤作为边3)建立每个棋盘格的所有合法走棋步骤,能够到达的棋盘格关系图2. 采用图搜索算法,搜寻一个长度为 (行*列-1) 的路径,路径上包含每个顶点恰好一次3. 如果沿单支深入搜索到无法继续时,路径长度还没达到预定值就清除颜色标记,返回上一层,换一个分支继续深入搜索4. 使用栈记录路径,并实施返回上一层的回溯操作
from 2.14_vertex&graph import Graph 
def legal_moves(x, y, bd_size):""":param x: x 坐标:param y: y 坐标:param bd_size: 格子数:return: 当前格子下一步的所有合法走棋位置"""new_moves = []# "马走日"的 8 个格子direction = [(-1, -2), (-1, 2), (-2, -1), (-2, 1),(1, -2), (1, 2), (2, -1), (2, 1)]for d in direction:new_x = x + d[0]new_y = y + d[1]# 确认不会走出棋盘if 0 <= new_x < bd_size and 0 <= new_y < bd_size:new_moves.append((new_x, new_y))return new_moves
def knight_graph(bd_size):"""构建走棋的关系图"""graph = Graph()# 遍历每个格子for row in range(bd_size):for col in range(bd_size):node_id = pos_to_node_id(row, col, bd_size)# 单步合法走棋new_pos = legal_moves(row, col, bd_size)print(new_pos)# 把"所有合法走棋的顶点"和"当前点"形成的边,添加进去for p in new_pos:new_id = pos_to_node_id(p[0], p[1], bd_size)graph.add_edge(node_id, new_id)return graphdef pos_to_node_id(row, col, bd_size):"""给每个格子编号"""return row * bd_size + col
def knight_tour(n, path, u, limit):""":param n: 层次 (步数):param path: 路径:param u: 当前顶点:param limit: 搜索总深度:return:"""# 标记当前顶点,并加入路径列表u.set_color('gray')path.append(u)# 对所有合法走棋逐一深入if n < limit:nbr_list = list(u.get_connections())# print(nbr_list)# nbr_list.sort(key=lambda x: x[0])# print(nbr_list)i = 0done = False# 选择未发现 (white) 的顶点深入while i < len(nbr_list) and not done:if nbr_list[i].get_color() == 'white':# 递归调用,层次 += 1done = knight_tour(n + 1, path, nbr_list[i], limit)i += 1# 若都无法完成预期深度,回溯,试本层下一个顶点if not done:path.pop()u.set_color('white')else:done = Truereturn done
缺点:算法性能高度依赖棋盘大小:时间复杂度为 O(k^n),指数时间复杂度搜索过程表现为改进:Warnsdorff 算法:对 nbr_list 进行改造,修改遍历下一格的次序将 u 的合法走棋目标格排序为:具有最少合法移动目标的格子,优先搜索

2.17_knight_tour_骑士周游问题 (深度优先 DFS)相关推荐

  1. 骑士周游(dfs+greedy)

    骑士周游(DFS+Greedy): 提示:马踏棋盘问题 也称 骑士周游问题 记录一道dfs+greedy的题目, 这道题能够帮助我们更好的理解dfs中的优化问题 题目描述: 提示:马踏棋盘问题(骑士周 ...

  2. Java对马踏棋盘问题(骑士周游问题)的实现

    14.10.2 马踏棋盘游戏代码实现 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个 ...

  3. 【数据结构与算法】马踏棋盘(骑士周游世界)算法

    一,基本介绍 1)马踏棋盘算法也称为骑士周游问题 2)将马随机放在国际象棋的8 × 8棋盘Board[0~7] [0~7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋 ...

  4. 骑士周游(马踏棋盘)问题

    1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...

  5. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

  6. 马踏棋盘算法(骑士周游)

    思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util. ...

  7. 马踏棋盘算法(骑士周游)+贪心优化

    思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util. ...

  8. 【小算法】图的遍历之深度优先(DFS)

    谈到算法,图的操作是避免不了. 而我们一般谈到图时,又必定会谈到图的遍历. 图的遍历通常有 2 种,深度优先(DFS) 和广度优先(BFS). 本篇博文讲解深度优先(DFS). 图的表示 图有两种表示 ...

  9. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

最新文章

  1. ecshop中ajax的调用原理
  2. c语言程序设计安徽区笔试部分,2021年安徽省二级C语言程序设计笔试样题-20210419093521.doc-原创力文档...
  3. linux停止rpc服务,linux下安装启动rpc服务
  4. Spring-aop-AbstractAutoProxyCreator
  5. Spring MVC (mvc框架)
  6. 解决Hadoop时no namenode to stop异常或则 是 jps中没有namenode
  7. 【没人看系列】js 数据类型
  8. Java 故障安全异常处理
  9. 我的2016(16行走,17前行)
  10. ios12越狱自签需要联网_从越狱的iOS切换到Android? 这是你需要知道的
  11. 最小公倍数c语言N-S图,最小公倍数n-s图
  12. 用python编写鸡兔同笼问题
  13. 1000+常用Python库大全,太实用了!
  14. ITIL 4Foundation认证
  15. 我的世界饮水系统服务器,MC水瓶 - 找服玩|Minecraft服务器列表
  16. 蓝牙适配器使用说明A
  17. web实现html页面思维导图效果
  18. 基于ESp8266的智能插座
  19. w7设置双显示器_Win7如何设置双显示器?设置双显示器的方法
  20. android深度睡眠对广播有什么影响吗,为什么WakefulBroadcastReceiver不能将我的设备从深度睡眠中唤醒?...

热门文章

  1. Spring Data Jpa 报错org.hibernate.LazyInitializationException: could not initialize proxy
  2. java一到6章上机代码_JAVA练习题(第6章).ppt
  3. java h5 交互 传数组, JS数组/对象的值为什么变了?你需要深入理解对象的值传递...
  4. 可能存在无限递归_Python之递归函数
  5. com/fasterxml/jackson/core/exc/InputCoercionException
  6. Android Studio 3.2升级后的编译问题解决办法
  7. python 模块,模块名和包 最最简单的使用 入门级 不够详细 不建议参考- - 扫一眼就好
  8. DS博客作业03--栈和队列
  9. sublime text3:呼出安装插件的快捷键
  10. mysql之 mysql 5.6不停机主从搭建(一主一从基于日志点复制)