力扣994 腐烂的橘子(BFS)

 使用BFS(层序遍历)来解决该题。起点就是腐烂橘子的点位集合。

错误思路:一开始脑子没转过来,对起点集合里的每一个点进行了一次bfs,然后求最小值

 1 class Solution {
 2 public:
 3     typedef pair<int, int> pii;
 4     map<pii, int> dis;
 5     vector<pii> start;
 6     bool visited[15][15];
 7     vector<vector<int>> grid;
 8     int m, n;
 9     vector<pii> temp;
10     void bfs(vector<pii> q, int step) {
11         vector<pii> temp;
12         for (auto i : q) {
13             int x = i.first, y = i.second;
14             dis[i] = min(dis[i], step);
15             if (x + 1 < m && grid[x + 1][y] == 1 && !visited[x + 1][y]) {
16                 visited[x + 1][y] = true;
17                 temp.push_back(make_pair(x + 1, y));
18             }
19             if (x - 1 >= 0 && grid[x - 1][y] == 1 && !visited[x - 1][y]) {
20                 visited[x - 1][y] = true;
21                 temp.push_back(make_pair(x - 1, y));
22             }
23             if (y + 1 < n && grid[x][y + 1] == 1 && !visited[x][y + 1]) {
24                 visited[x][y + 1] = true;
25                 temp.push_back(make_pair(x, y + 1));
26             }
27             if (y - 1 >= 0 && grid[x][y - 1] == 1 && !visited[x][y - 1]) {
28                 visited[x][y - 1] = true;
29                 temp.push_back(make_pair(x, y - 1));
30             }
31         }
32         if (!temp.empty())
33             bfs(temp, step + 1);
34     }
35     int orangesRotting(vector<vector<int>>& grid) {
36         m = grid.size();
37         n = grid[0].size();
38         this -> grid = grid;
39         for (int i = 0; i < m; ++i) {
40             for (int j = 0; j < n; ++j) {
41                 dis[make_pair(i, j)] = 0x3f3f3f;
42                 if (grid[i][j] == 2) {
43                     start.push_back(make_pair(i, j));
44                 } else if (grid[i][j] == 0) {
45                     dis[make_pair(i, j)] = -1;
46                 }
47             }
48         }
49         for (auto i : start) {
50             memset(visited, false, sizeof(visited));
51             bfs({i}, 0);
52         }
53         int result = 0;
54         for (auto i : dis) {
55             result = max(i.second, result);
56         }
57         if (result == 0x3f3f3f)
58             result = -1;
59         return result;
60     }
61 };

正确思路:每个腐烂橘子的贡献是一致的,直接以起点集合为层序遍历的第0层,遍历一次就行。

 1 class Solution {
 2 public:
 3     typedef pair<int, int> pii;
 4     vector<pii> start; //起点集合
 5     bool visited[15][15];
 6     vector<vector<int>> grid;
 7     int m, n;
 8     vector<pii> temp;
 9     int result = 0;
10     int oranges = 0; //记录新鲜橘子个数
11     void bfs(vector<pii> q, int step) {
12         result = max(result, step);
13         vector<pii> temp;
14         for (auto i : q) {
15             int x = i.first, y = i.second;
16             if (x + 1 < m && grid[x + 1][y] == 1 && !visited[x + 1][y]) {
17                 visited[x + 1][y] = true;
18                 oranges--;
19                 temp.push_back(make_pair(x + 1, y));
20             }
21             if (x - 1 >= 0 && grid[x - 1][y] == 1 && !visited[x - 1][y]) {
22                 visited[x - 1][y] = true;
23                 oranges--;
24                 temp.push_back(make_pair(x - 1, y));
25             }
26             if (y + 1 < n && grid[x][y + 1] == 1 && !visited[x][y + 1]) {
27                 visited[x][y + 1] = true;
28                 oranges--;
29                 temp.push_back(make_pair(x, y + 1));
30             }
31             if (y - 1 >= 0 && grid[x][y - 1] == 1 && !visited[x][y - 1]) {
32                 visited[x][y - 1] = true;
33                 oranges--;
34                 temp.push_back(make_pair(x, y - 1));
35             }
36         }
37         if (!temp.empty())
38             bfs(temp, step + 1);
39     }
40     int orangesRotting(vector<vector<int>>& grid) {
41         m = grid.size();
42         n = grid[0].size();
43         this -> grid = grid;
44         for (int i = 0; i < m; ++i) {
45             for (int j = 0; j < n; ++j) {
46                 if (grid[i][j] == 2) {
47                     start.push_back(make_pair(i, j));
48                 } else if (grid[i][j] == 1) {
49                     oranges++;
50                 }
51             }
52         }
53         memset(visited, false, sizeof(visited));
54         bfs(start, 0);
55         if (oranges > 0)
56             return -1;
57         return result;
58     }
59 };

 

posted on 2025-02-20 14:21  Coder何  阅读(29)  评论(0)    收藏  举报