活跃农民
- 积分
- 923
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-3-2
- 最后登录
- 1970-1-1
|
楼主说的题意很清晰,就是BFS的时候注意看看每个cell有没有被4个1包围即可,C++代码测了一下没问题:
- #include <iostream>
- #include <vector>
- #include <queue>
- using namespace std;
- static const vector<int> di {0, 0, 1, -1};
- static const vector<int> dj {1, -1, 0, 0};
- bool inBound(const int i, const int j, const size_t m, const size_t n) {
- return (0 <= i) && (i < m) && (0 <= j) && (j < n);
- }
- void bfs(vector<vector<int>> &grid, int i, int j, const size_t m, const size_t n,
- vector<int> &result) {
- queue<pair<int, int>> q;
- q.push({i, j});
- // mark this cell visited
- grid[i][j] = -1;
-
- int perimeter = 0;
- while (!q.empty()) {
- pair<int, int> curr = q.front();
- q.pop();
- int count = 0;
- for (int k = 0; k < 4; ++k) {
- int ni = curr.first + di[k];
- int nj = curr.second + dj[k];
- if (inBound(ni, nj, m, n)) {
- if (grid[ni][nj] == 0) continue;
- if (grid[ni][nj] == 1) {
- q.push({ni, nj});
- grid[ni][nj] = -1;
- }
- count++;
- }
- }
- if (count != 4) perimeter++;
- }
- result.push_back(perimeter);
- }
- vector<int> computePerimeter(vector<vector<int>> &grid) {
- if (grid.empty() || grid[0].empty()) {
- return {};
- }
-
- const size_t m = grid.size(), n = grid[0].size();
- vector<int> result;
- for (int i = 0; i < m; ++i) {
- for (int j = 0; j < n; ++j) {
- if (grid[i][j] == 1) {
- bfs(grid, i, j, m, n, result);
- }
- }
- }
- return result;
- }
- int main() {
- vector<vector<int>> grid {{1, 0, 0, 1, 1, 1},
- {1, 0, 0, 1, 1, 1},
- {0, 0, 0, 0, 1, 1}};
-
- vector<int> result = computePerimeter(grid);
- return 0;
- }
复制代码
|
|