python 洪水

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lyc0424/article/details/102749940

题目描述

在一个nxm矩阵形状的城市里爆发了洪水,洪水从(0,0)的格子流到这个城市,在这个矩阵中有的格子有一些建筑,洪水只能在没有建筑的格子流动。请返回洪水流到(n - 1,m - 1)的最早时间(洪水只能从一个格子流到其相邻的格子且洪水单位时间能从一个格子流到相邻格子)。

给定一个矩阵map表示城市,其中map[i][j]表示坐标为(i,j)的格子,值为1代表该格子有建筑,0代表没有建筑。同时给定矩阵的大小nm(n和m均小于等于100),请返回流到(n - 1,m - 1)的最早时间。保证洪水一定能流到终点。

一开始博主参考下面这篇博客写了一段python的代码

https://blog.csdn.net/weixin_37781578/article/details/89745288

首先语法没有错误,但是就是不通过样例,希望各位路过的大佬能指点一二!!!

然后看了一下下面那个通过的代码

# -*- coding:utf-8 -*-
 
class Flood:
        #计算洪水到达最短时间
        #洪水可以从四个方向流进来,也就是可以从所有的邻居节点到达
        #广度优先遍历
        #必须要借助一个队列,来存储point,直接用(i,j)来表示
        #要有一个获取邻居节点函数(避开有建筑的点)
        #distance 字典,用来存储(0,0)到达该节点的距离
    def floodFill(self, tmap, n, m):
        # write code here
        #
        self.m = m
        self.n = n
        self.tmap = tmap
        queue = []
        distance = {}
        distance[(0,0)] = 0
        while queue:
            pop_point = queue.pop()
            for point in self.graph_Neighbor(pop_point):
                if point not in distance:
                    queue.append(point)
                    distance[point] = distance[pop_point]+1
        return m+n-2
     
    def graph_Neighbor(self, p):
        neighbor = []
        i = p[0]
        j = p[1]
        if 0<=i-1<n and self.tmap[i-1, j]==0:
            neighbor.append((i-1, j))
        if 0<=i+1<n and self.tmap[i+1, j]==0:
            neighbor.append((i+1, j))
        if 0<=j-1<n and self.tmap[i, j-1]==0:
            neighbor.append((i, j-1))
        if 0<=j+1<n and self.tmap[i, j+1]==0:
            neighbor.append((i, j+1))
        return neighbor

嗯,感觉解释的挺清楚的,但是queue不是一直为空嘛?这样不就是相当于直接返回m+n-2嘛?你文字叙述的方法根本没用上好嘛。虽然我知道最终答案是这个,但似乎太没技术含量了?然后我把之前写的代码中的队列换成了列表

#import queue
# -*- coding:utf-8 -*-
class Flood:
    def floodFill(self, tmap, n, m):
        i , j = 0 , 0
        x = []
        y = []
        x.append(0)
        y.append(0)
        #x = queue.Queue()
        #y = queue.Queue()
        #x.put(0)
        #y.put(0)
        #tmap[0][0] = 0
        while x :
            #i = x.get()
            #j = y.get()
            i = x.pop()
            j = y.pop()
            if i==n-1 and j==m-1 :
                return tmap[i][j]
            elif i<n-1 and tmap[i+1][j]==0 :
                #x.put(i+1)
                #y.put(j)
                x.append(i+1)
                y.append(j)
                tmap[i+1][j] = tmap[i][j]+1
            elif j<m-1 and tmap[i][j+1]==0 :
                #x.put(i)
                #y.put(j+1)
                x.append(i)
                y.append(j+1)
                tmap[i][j+1] = tmap[i][j]+1
        return tmap[i][j]

 然后通过了,通过了。。。

嗯,看来之前的队列确实用错了。。。希望各位大佬能指点一二。。。

猜你喜欢

转载自blog.csdn.net/lyc0424/article/details/102749940