1751.牛郎织女

牛郎织女 · Cowherd&Weaver

描述

又到了七夕节,牛郎织女相约一起去一个n*m大小的迷宫maze里玩耍。然而没过多久,他们就倒霉地走散了。现在给定由.,*,S,T组成的矩阵maze,其中.表示空地,*表示障碍物,S表示牛郎的位置 ,T表示织女的位置,牛郎和织女都会试图寻找对方,不停地在矩阵中走动(他们可以每次向上下左右四个方向移动一格或者站着不动,但是不能走到迷宫外面或者障碍物),请问他们是否有可能重逢?如果有可能,返回True,否则返回False

2<=`n,m`<=1000

样例

样例1:

输入: 
[
"S..*",
"*.**",
"...T"
]
输出: true
说明:
织女选择不动
牛郎行动路线(0,0)->(0,1)->(1,1)->(2,1)->(2,2)->(2,3)

样例2:

输入:
[
"S..*",
"***.",
"...T"
]
输出: false
说明:
这两个人无论如何和碰不上了

BFS写法
#牛郎织女
class Solution:
    def function(self, maze):
        n, m = len(maze), len(maze[0])
        
        for i in range(n):
            for j in range(m):
                if (maze[i][j] == 'S'):
                    return self.bfs([[i, j]], maze)

    
    #bfs,看是否可以流过去
    def bfs(self, queue, maze):
        directions = [[0, 1], [0, -1], [-1, 0], [1, 0]]
        visted = []

        while queue:
            pop_num = queue.pop(0)
            pop_x = pop_num[0]
            pop_y = pop_num[1]

            visted.append([pop_x, pop_y])

            
            #边界情况
            for direction in directions:
                new_x = pop_x + direction[0]
                new_y = pop_y + direction[1]

                if (new_x < 0 or new_x >= len(maze) or new_y < 0 or new_y >= len(maze[0])):
                    continue
                                    
                if (maze[new_x][new_y] == 'T'):
                    return True 
                    
                if (maze[new_x][new_y] == '.') and [new_x, new_y] not in visted:
                    queue.append([new_x, new_y])
                    
        return False

result = Solution().function([
"S..*",
"***.",
"...T"
])
print(result)
                
 
posted @ 2020-08-15 21:15  风不再来  阅读(371)  评论(0编辑  收藏  举报