994. 腐烂的橘子 Golang

994. 腐烂的橘子

在给定的网格中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

示例 1:在这里插入图片描述
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:

输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:

输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2

思路

我的主题思路与官方解题都是广度优先搜索。
官方方法维护了一个队列来表示最近腐烂的一批橘子,同时又维护了一个矩阵来记录距离,这个距离对应这题目里的腐烂的最小时间。
但是我这里只维护了一个队列,省去了矩阵的内存空间。
区别是,判断过的烂橘子不从队列中移除,仅通过一个next int来记录下一层的位置。
最后请教一下,C++里记录对组pair非常好用,Go里有没有什么好办法呢?我这里记录坐标的方式感觉很别扭。

我的解答

在这里插入图片描述


func orangesRotting(grid [][]int) int {
	x:=[]int{}
	y:=[]int{}
	cnt,time:=0,0
	for i:=0;i<len(grid);i++{
		for j:=0;j<len(grid[0]);j++{
			if grid[i][j]==2{
				x=append(x,i)
				y=append(y,j)
			}else if grid[i][j]==1{
				cnt=cnt+1
			}
		}
	}
	xa:=[]int{-1,1,0,0}
	ya:=[]int{0,0,-1,1}
	next:=len(x)
	for i,xx,yy:=0,0,0;i<len(x);i++{
		if i==next{
			next=len(x)
			time=time+1
		}
		for j:=0;j<4;j++{
			xx=x[i]+xa[j]
			yy=y[i]+ya[j]
			if xx<0||xx>len(grid)-1||yy<0||yy>len(grid[0])-1||grid[xx][yy]!=1{
				continue
			}
			marked:=false
			for k:=0;k<len(x);k++{
				if xx==x[k]&&yy==y[k]{
					marked=true
					break
				}
			}
			if marked{
				continue
			}
			if grid[xx][yy]==1{
				cnt=cnt-1
				x=append(x,xx)
				y=append(y,yy)
			}
		}
	}
	if cnt==0{
		return time
	}
	return -1
}
发布了38 篇原创文章 · 获赞 0 · 访问量 1038

猜你喜欢

转载自blog.csdn.net/Cyan1956/article/details/104650419