第一次做这种题,看了题解之后知道原来是使用一种叫“BFS”的方法来解,即广度优先遍历。
个人理解:关于BFS,广度优先遍历,思想很简单,先定义一个队列,心中要有一个树的结构,每次只搜索树的一层,搜索到当前节点就把当前节点的母节点从队列中删除,同时将自己入队,当搜索到最后一层,队列中还有最后一层节点,再做一次循环,没有下一节点了,同时把上一轮(最后一层)的结点释放了,那么搜索就完成了,退出循环。
至于你想在每个节点做什么事情,那就在搜索到该结点的时候做了它,所有结点都做了事情,那么整个算法就结束了。
针对腐烂的橘子这道题,题目的意思:每分钟每个烂橘子可以把四方向相邻的好橘子变腐烂,多少分钟之后橘子全部腐烂?如果未腐烂,则返回-1。
对于每个单元格,可以有好橘子、烂橘子、空。
我们可以这样理解:
- 烂橘子要搞事情了,因为每一分钟烂橘子都要把旁边的橘子搞烂。
- 那么不妨把烂橘子当成是结点,刚开始的烂橘子就是首层结点,当在当前节点下面搞事情时,先把自己出队。
- 当遍历这一次烂橘子的过程中,有好橘子被搞烂,这些橘子就入队(因为下一分钟他们也要参搞烂别的好橘子)
- 遍历一次这些烂橘子,遍历完,分钟数+1,(因为是烂橘子是同时让相邻橘子变烂的)
举个例子:
c++代码:参考此处
int orangesRotting(vector<vector<int>>& grid) {
int min = 0, fresh = 0;
//方向
vector<pair<int,int>> direct = {
{