盲目搜索算法

头哥盲目搜索算法
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
 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值