力扣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 };
浙公网安备 33010602011771号