题目链接:腐烂的苹果_牛客题霸_牛客网 (nowcoder.com)
一、分析题目
多源 BFS 问题,加一点最短路的思想,固定套路。
二、代码
//看了题解之后AC的代码
class Solution {
private:
int n, m;
bool vis[1010][1010];
int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param grid int整型vector<vector<>>
* @return int整型
*/
int rotApple(vector<vector<int> >& grid) {
n=grid.size(), m=grid[0].size();
queue<pair<int, int>> q;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(grid[i][j]==2)
q.push({i, j});
int t=0;
while(q.size())
{
t++;
int size=q.size();
while(size--)
{
auto [a, b]=q.front();
q.pop();
for(int k=0; k<4; k++)
{
int x=a+dx[k], y=b+dy[k];
if(x>=0 && x<n && y>=0 && y<m && !vis[x][y] && grid[x][y]==1)
{
vis[x][y]=true;
q.push({x, y});
}
}
}
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(!vis[i][j] && grid[i][j]==1)
return -1;
return t-1;
}
};
//值得学习的代码
class Solution
{
int m, n;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
bool vis[1010][1010] = { 0 };
public:
int rotApple(vector<vector<int> >& grid)
{
m = grid.size(), n = grid[0].size();
queue<pair<int, int>> q;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(grid[i][j] == 2)
q.push({i, j});
int ret = 0;
while(q.size())
{
int sz = q.size();
ret++;
while(sz--)
{
auto [a, b] = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int x = a + dx[i], y = b + dy[i];
if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y])
{
vis[x][y] = true;
q.push({x, y});
}
}
}
}
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(grid[i][j] == 1 && !vis[i][j])
return -1;
return ret - 1;
}
};
三、反思与改进
这道题目我是用 dfs 做的,暴力过了 70% 的样例,但我很清楚正确答案肯定是要用到 bfs,是层序遍历整个网格,但在做题的时候把 bfs 最基本的内容给忘记了,连其对应辅助的栈结构都没想起来。还有一个主要原因是:多源 bfs 这一块我还没有进行系统性的学习,目前只接触了最基础的 bfs,不过我不认为这是做不出这道题目的理由,究其根本是连本质都忘记了,而不是 bfs 的扩展没学习到,所以要抓紧时间把 bfs 相关算法学习完,并将其算法原理熟烂于心。