队列 队列内置函数 用栈解决迷宫问题(深度优先搜索) 用列表解决(广度优先)

在这里插入图片描述

class Queue:
	def __init__(self,size=100):
		self.queue = [0 for _ in range(size)]
		self.size = size
		self.rear = 0#队尾指针 进队
		self.front = 0 #队首指针,出队
	def push(self,element):#1 2 3 ->   - 1 2 3]
		if not self.is_filled():
			self.rear = (self.rear+1)%self.size
			self.queue[self.rear]=element
		else:
			raise IndexError('Queue is filled')
	def pop(self):
		if not self.is_empty():
			self.front = (self.front+1)%self.size
			return self.queue[self.front]
		else:
			raise IndexError('Queue is empty')
	def is_empty(self):#判断队空
		return self.rear == self.front
	def is_filled(self):#判断队满
		return (self.rear+1)%self.size == self.front

q = Queue(5)
for i in range(4):
	q.push(i)
for i in range(2):
	print(q.pop())	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

from collections import  deque

# q = deque([1,2,3,4,5],5)
# q.append(6)  #队尾进队
# print(q.popleft()) #队首出队
#用于双向队列
# q.appendleft(1) #队首进队
# q.pop() #队尾出队

def tail(n):
	'''
	with open(r'filename.txt') as f:
		data_user=pd.read_csv(f)  #文件的读操作

	with open('data.txt', 'w') as f:
		f.write('hello world')  #文件的写操作
	'''
	with open('test.txt','r') as f:
		q = deque(f,n)
		return q

for line in tail(5):
	print(line,end = '')

在这里插入图片描述

在这里插入图片描述

maze = [
	[1,1,1,1,1,1,1,1,1,1],
	[1,0,0,1,0,0,0,1,0,1],
	[1,0,0,1,0,0,0,1,0,1],
	[1,0,0,0,0,1,1,0,0,1],
	[1,1,1,1,1,0,0,0,0,1],
	[1,0,0,0,1,0,0,0,0,1],
	[1,0,1,0,0,0,1,0,0,1],
	[1,0,1,1,1,0,1,1,0,1],
	[1,1,0,0,0,0,0,0,0,1],
	[1,1,1,1,1,1,1,1,1,1]
]

directions = [
	lambda  x,y : (x,y+1),
	lambda  x,y : (x+1,y),
	lambda  x,y : (x,y-1),
	lambda  x,y : (x-1,y)
]
def maze_path(x1,y1,x2,y2):
	stack = []
	stack.append((x1,y1))#stack列表下标存的内容一个(x,y)坐标元组
	while(len(stack)>0):
		curNode = stack[-1]#当前节点,也就是栈顶存的内容
		# print(curNode)
		# break
		#curNode(1,1)
		if curNode[0] == x2 and curNode[1] ==y2:#走到终点
			for p in stack:
				print(p,end='->')
			return True
		#x,y四个方向 (x,y+1);(x+1,y);(x,y-1);(x-1,y)
		for dir in directions:#directions 是个存有四个方向的列表,遍历四个方向
			nextNode = dir(curNode[0],curNode[1])#dir格式参照directions,是个坐标(x,y)
			if maze[nextNode[0]][nextNode[1]] == 0:
				stack.append(nextNode)
				maze[nextNode[0]][nextNode[1]] = 2
				break
		else:
			maze[nextNode[0]][nextNode[1]] = 2
			stack.pop()
	else:
		print('not path there')
		return False

maze_path(1,1,8,8)

——————————————————————
在这里插入图片描述

from collections import  deque
maze = [
	[1,1,1,1,1,1,1,1,1,1],
	[1,0,0,1,0,0,0,1,0,1],
	[1,0,0,1,0,0,0,1,0,1],
	[1,0,0,0,0,1,1,0,0,1],
	[1,0,1,1,1,0,0,0,0,1],
	[1,0,0,0,1,0,0,0,0,1],
	[1,0,1,0,0,0,1,0,0,1],
	[1,0,1,1,1,0,1,1,0,1],
	[1,1,0,0,0,0,0,0,0,1],
	[1,1,1,1,1,1,1,1,1,1]
]

directions = [
	lambda  x,y : (x,y+1),
	lambda  x,y : (x+1,y),
	lambda  x,y : (x,y-1),
	lambda  x,y : (x-1,y)
]
def print_r(path):
	curNode = path[-1]
	real_path =[]
	while curNode[2] != -1:
		real_path.append((curNode[0],curNode[1]))#curNode[0:2]
		curNode = path[curNode[2]]
	real_path.append(curNode[0:2])#起点append进去
	real_path.reverse()
	for node in real_path:
		print(node)
def maze_path_queue(x1,y1,x2,y2):
	queue = deque()
	queue.append((x1,y1,-1))#三个参数 x,y,上一个节点
	path = []
	while len(queue) >0:
		curNode = queue.popleft()
		path.append(curNode)
		if curNode[0] == x2 and curNode[1] ==y2:
			print_r(path)
			return True
		for dir in directions:
			nextNode = dir(curNode[0],curNode[1])
			if maze[nextNode[0]][nextNode[1]] == 0:
				queue.append((nextNode[0],nextNode[1],len(path)-1))#后续节点进队,记录哪个节点带来
				maze[nextNode[0]][nextNode[1]] =2#标记走过
	else:
		print('no path there')
		return  False

maze_path_queue(1,1,8,8)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用广度优先算法生成解决迷宫路径问题的 Python 代码: ```python from queue import Queue # 迷宫地图,其中 0 表示可走的路,1 表示障碍物 maze = [ [0, 0, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 1, 0, 0], [1, 0, 0, 1, 0], [0, 0, 0, 0, 0] ] # 迷宫的行数和列数 n = len(maze) m = len(maze[0]) # 起点和终点坐标 start_pos = (0, 0) end_pos = (n-1, m-1) # 定义四个方向的偏移量 directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] # 广度优先算法 def bfs(): # 初始化队列和起点 q = Queue() q.put(start_pos) visited = set() visited.add(start_pos) prev = {} # 记录路径的前一个位 # 开始搜索 while not q.empty(): cur_pos = q.get() # 判断是否到达终点 if cur_pos == end_pos: return True, prev # 搜索当前位的四个方向 for d in directions: next_pos = (cur_pos[0]+d[0], cur_pos[1]+d[1]) # 判断下一个位是否越界或者是障碍物 if next_pos[0] < 0 or next_pos[0] >= n or next_pos[1] < 0 or next_pos[1] >= m or maze[next_pos[0]][next_pos[1]] == 1: continue # 判断下一个位是否已经访问过 if next_pos not in visited: q.put(next_pos) visited.add(next_pos) prev[next_pos] = cur_pos # 没有找到终点 return False, prev # 调用广度优先搜索函数 found, prev = bfs() if found: # 构建路径 path = [end_pos] cur = end_pos while cur != start_pos: cur = prev[cur] path.append(cur) path.reverse() # 输出路径 print("可以到达终点!路径为:") for i in range(n): for j in range(m): if (i, j) in path: print("★", end="") elif maze[i][j] == 1: print("■", end="") else: print("□", end="") print() else: print("无法到达终点!") ``` 这段代码与之前的代码唯一不同的地方是在输出路径时,将路径上的位用星号(★)标记,将障碍物用实心方块(■)标记,将其他位用空心方块(□)标记。这样,输出的结果就是一个带有路径的迷宫地图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值