leetCode994. 腐烂的橘子 -BFS

引用
https://leetcode-cn.com/problems/rotting-oranges/

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

  • 值 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

class Solution {
		 int row = 0;
		 int col = 0;
	public  int orangesRotting(int[][] grid) {
		row = grid.length;
		col = grid[0].length;
		// 遍历 查看烂橘子的坐标;
		Queue<ArrayList<Integer>> bucket = new LinkedList<ArrayList<Integer>>();
		int i, j;
		boolean hasFresh = false;
		for (i = 0; i < row; i++) {
			for (j = 0; j < col; j++) {
				if (grid[i][j] == 2) {
					ArrayList<Integer> pos = new ArrayList<Integer>();
					pos.add(i);
					pos.add(j);
					bucket.offer(pos);
				} else if (grid[i][j] == 1) {
					hasFresh = true;
				}
			}
		}
		// 没有新鲜橘子 0秒
		if (!hasFresh) {
			return 0;
		}

		// 没有变质橘子 -1
		if (bucket.size() == 0) {
			return -1;
		}
		
		int time = 0;
		// 遍历坏橘子坐标
		while (!bucket.isEmpty()) {
			// 每一批坏橘子的数量
			int count = bucket.size();
//			System.out.println("===第 "+time+" 轮感染= count:"+count+"==");
			for (int k = 0; k < count; k++) {
				ArrayList<Integer> pos = bucket.poll();
				int x = pos.get(0), y = pos.get(1);
//				System.out.println("坏橘子坐标"+x+","+y);
				// 开始污染
				// 上
				if (check(x, y + 1) && grid[x][y+1] == 1) {
					grid[x][y+1] = 2;
					ArrayList<Integer> temp = new ArrayList<Integer>();
					temp.add(x);
					temp.add(y+1);
					bucket.offer(temp);
//					System.out.println("坐标点被感染: "+x+","+ (y+1));
				}
				// 下
				if (check(x, y - 1) && grid[x][y-1] == 1) {
					grid[x][y-1] = 2;
					ArrayList<Integer> temp = new ArrayList<Integer>();
					temp.add(x);
					temp.add(y-1);
					bucket.offer(temp);
//					System.out.println("坐标点被感染: "+x+","+ (y-1));
				}
				// 左
				if (check(x - 1, y) && grid[x-1][y] == 1) {
					grid[x-1][y] = 2;
					ArrayList<Integer> temp = new ArrayList<Integer>();
					temp.add(x-1);
					temp.add(y);
					bucket.offer(temp);
//					System.out.println("坐标点被感染: "+(x-1)+","+ y);
				}
				// 右
				if (check(x + 1, y) && grid[x + 1][y] == 1) {
					grid[x+1][y] = 2;
					ArrayList<Integer> temp = new ArrayList<Integer>();
					temp.add(x+1);
					temp.add(y);
					bucket.offer(temp);
//					System.out.println("坐标点被感染: "+(x+1)+","+ y);
				}
			}
			time++;
		}
		hasFresh = false;
		// 存在未感染的橘子
		for (i = 0; i < row; i++) {
			for (j = 0; j < col; j++) {
				if (grid[i][j] == 1) {
//					System.out.println("此坐标点有新鲜橘子 i:"+i+"j:"+j);
					hasFresh = true;
					break;
				}
			}
		}
		if (hasFresh) {
			return -1;
		} else {
			return time-1;
		}
		
	}

	private  boolean check(int x, int y) {
		if (x >= 0 && x < row && y >= 0 && y < col) {
			return true;
		}
		return false;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于LeetCode上的问题994.腐烂橘子,你可以使用Python来解决。下面是一个示例代码: ```python from collections import deque def orangesRotting(grid): # 记录网格的行数和列数 row, col = len(grid), len(grid[0]) # 定义四个方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 使用队列来保存腐烂橘子的位置 queue = deque() # 记录新鲜橘子的数量 fresh_count = 0 # 遍历整个网格,初始化队列和新鲜橘子的数量 for i in range(row): for j in range(col): if grid[i][j] == 2: # 腐烂橘子 queue.append((i, j)) elif grid[i][j] == 1: # 新鲜橘子 fresh_count += 1 # 如果新鲜橘子的数量为0,直接返回0 if fresh_count == 0: return 0 # 初始化分钟数 minutes = 0 # 开始进行BFS,直到队列为空 while queue: # 记录当前分钟数下,队列中的元素数量 size = len(queue) # 遍历当前分钟数下的所有腐烂橘子 for _ in range(size): x, y = queue.popleft() # 遍历四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断新位置是否在网格内,并且是新鲜橘子 if 0 <= nx < row and 0 <= ny < col and grid[nx][ny] == 1: # 将新鲜橘子变为腐烂状态 grid[nx][ny] = 2 # 将新鲜橘子的位置加入队列 queue.append((nx, ny)) # 新鲜橘子的数量减1 fresh_count -= 1 # 如果当前分钟数下,没有新鲜橘子了,结束循环 if fresh_count == 0: break # 每遍历完一层,分钟数加1 minutes += 1 # 如果最后还有新鲜橘子,返回-1,否则返回分钟数 return -1 if fresh_count > 0 else minutes ``` 你可以将给定的网格作为参数传递给`orangesRotting`函数来测试它。请注意,该代码使用了BFS算法来遍历橘子,并计算腐烂的分钟数。希望能对你有所帮助!如果有任何疑问,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值