头哥盲目搜索算法
1广度优先搜索
def PlayMazz(mazz, start, end):
'''
走迷宫,从start走到end
:param mazz: 图
:param start: 图的起点
:param end: 图的出口
'''
# queue为队列,当队列为空或者当前地点为终点时搜索结束
closed, queue = set(), [start]
#********* Begin *********#
while(queue!=0):
closed.add(queue[0])
if queue[0]==end:
print(end,end='')
break
else:
print(queue[0],end='')
for i in mazz[queue[0]]:
if i in closed:
pass
else:
queue.append( i )
queue.remove(queue[0])
#********* End *********#
2深度优先搜索
def PlayMazz(graph, start,end, visited=None):
'''
深度优先搜索,从1走到9
:param graph: 搜索的空间
:param start: 开始搜索的起点
:param visited: 已经搜索过的点集合
'''
if visited is None:
visited = set()
visited.add(start)
print(start, end='')
# 当前地点为终点时结束搜索
if start == end:
return
else:
for i in graph[start]:
PlayMazz(graph,i,end)
#********* Begin *********#
# 看看当前位置有哪些路可以走,如果能走并且之前没有走过就走
#********* End *********#
3第3关:盲目搜索算法的应用
class Solution:
def __init__(self, n=0):
self.vis = [0]*n # 用于标记是否存在皇后的二维列表(初始值全为0)
self.ans = 0 # 用于存储答案(N皇后方案数,初始值0)
self.n = n # 用于存储皇后数量n
def solveNQueens(self):
"""求解N皇后问题(调用self.DFS函数)
:rtype: self.ans: int #返回N皇后放置方案数
"""
# 请在这里补充代码,完成本关任务
# ********** Begin **********#
self.DFS(0,self.n)
return self.ans
# ********** End **********#
def DFS(self, row, n):
"""深度优先搜索N皇后问题的解空间
:type: row: int #NxN棋盘的第row行
:type: n: int #皇后数量n
:rtype: None #无返回值
"""
# 请在这里补充代码,完成本关任务
# ********** Begin **********#
if row == n:
self.ans += 1
return
while self.vis[row] < n:
# print(1)
if self.judge(row):
self.DFS(row + 1, self.n)
self.vis[row] += 1
else:
self.vis[row] += 1
if self.vis[row] == n:
self.vis[row] = 0
return
# ********** End **********#
def judge(self,row): # 判断是否在同一列、同一对角线上
if row == 0:
return True
for i in range(row):
if abs(self.vis[row] - self.vis[i]) == row - i or self.vis[row] == self.vis[i]: # 若在对角线上则两个皇后横轴和纵轴的距离相等
return False
return True