暴力解决法、广度优先搜索( BFS )。不过中间求得时间次数需要一些巧妙的方法。
一、题目
在给定的网格中,每个单元格可以有以下三个值之一:
值 0
代表空单元格;
值 1
代表新鲜橘子;
值 2
代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1
。
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
二、思路
说实话,我一开始没有什么思路。看到评论说 BFS
,我才想起来广度优先搜索方法。
广度优先搜索
类似于二叉树的层次遍历算法,从起始顶点开始,依次访问邻接顶点,直到图中所有顶点都被访问过为止。并且借助队列,以记忆正在访问的顶点的下一层顶点。
其中有几个点需要 注意:
- 如何知道坏橘子的位置?
- 如何找相邻的橘子?
- 如何实现时间计数?
第一点好说,我们需要定义一个结构体作为队列元素的节点,节点中定义 x
y
的坐标信息。只要将二维数组依次遍历,然后找出值等于 2
的橘子,同时将橘子的坐标存入节点信息中即可。
第二点:我们需要定义一个数组,存放方向值: int dy[] = {0,0,-1,1};
和 int dx[] = {1,-1,0,0};
。这样,我们可以找到上下左右相邻的橘子。
第三点:我们需要在节点信息中另外定义一个信息: cout
用来计数。当找到相邻的橘子时,计数+1,加一后的结果存放至相邻节点的信息中。注意:这里不止一个相邻节点。
三、代码实现
1 |
|