-
定义状态表示:将八数码问题的状态表示为一个3x3的矩阵,矩阵中的每个元素表示棋盘上的一个方块,空白方块用0表示。
-
初始化:将初始状态作为搜索的起始点,并将其设为当前状态。创建一个队列(通常是先进先出的队列)用于存储待扩展的状态。
-
扩展状态:对当前状态进行扩展,即生成所有可能的下一步状态。通过将空白方块与相邻的方块进行交换来生成新状态。
-
检查目标:在每次扩展状态时,检查新生成的状态是否达到了目标状态(通常是按照从左到右、从上到下的顺序排列的状态)。如果达到了目标状态,则搜索结束,找到了解决方案。
-
更新状态:将新生成的状态添加到队列中,作为待扩展的状态。
-
重复步骤3至5:从队列中取出下一个待扩展的状态,重复步骤3至5,直到队列为空或找到了目标状态。
-
回溯路径:如果找到了目标状态,可以通过记录每个状态的父状态来回溯搜索路径,直到回溯到初始状态,得到解决八数码问题的移动序列。
广度优先搜索保证可以找到最短路径,但是在搜索过程中可能需要存储大量的状态,所以对于复杂的八数码问题可能需要较大的存储空间和计算时间。
python代码:
from collections import deque
def breadth_first_search(initial_state, goal_state):
queue = deque() # 创建一个双端队列用于存储待扩展的状态
visited = set() # 创建一个集合用于存储已访问的状态,以避免重复访问
parent = {} # 创建一个字典用于记录每个状态的父状态,用于回溯路径
queue.append(initial_state) # 将初始状态加入队列
visited.add(tuple(initial_state)) # 将初始状态转换为元组并加入已访问集合
parent[tuple(initial_state)] = None # 初始状态没有父状态,设为None
while queue:
current_state = queue.popleft() # 取出队列中的第一个状态作为当前状态
if current_state == goal_state:
# 找到了目标状态,回溯路径
path = []
while current_state:
path.append(current_state)
current_state = parent[tuple(current_state)]
path.reverse()
return path
next_states = generate_next_states(current_state) # 生成下一步可能的状态
for next_state in next_states:
if tuple(next_state) not in visited:
queue.append(next_state)
visited.add(tuple(next_state))
parent[tuple(next_state)] = current_state # 记录下一步状态的父状态为当前状态
return None # 如果队列为空仍然没有找到目标状态,表示无解
def generate_next_states(state):
next_states = []
blank_index = state.index(0) # 找到空白方块的索引
adjacent_indices = get_adjacent_indices(blank_index) # 获取可以移动的方块的索引
for index in adjacent_indices:
new_state = list(state) # 创建当前状态的副本
new_state[blank_index] = new_state[index] # 将空白方块与相邻方块交换
new_state[index] = 0
next_states.append(new_state) # 添加生成的新状态到下一步状态列表
return next_states
def get_adjacent_indices(index):
adjacent_indices = []
if index // 3 > 0:
adjacent_indices.append(index - 3) # 上方方块
if index // 3 < 2:
adjacent_indices.append(index + 3) # 下方方块
if index % 3 > 0:
adjacent_indices.append(index - 1) # 左侧方块
if index % 3 < 2:
adjacent_indices.append(index + 1) # 右侧方块
return adjacent_indices
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/ed9fd837d4cce061ecd5be8e85027ce8.png)
![img](https://img-blog.csdnimg.cn/img_convert/52115be22660f973587a1ae502e3ddda.png)
![img](https://img-blog.csdnimg.cn/img_convert/46506ae54be168b93cf63939786134ca.png)
![img](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
<img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />