Heng_Xin 题目问答 · 2024/4/5
好像评测的输入有问题?
无论我采用cin还是scanf("%s")都无法正确的输入数据, 直接cin >> grid[i][j]也不行qwq, 不过代码已经在[P8662 [蓝桥杯 2018 省 AB] 全球变暖 - 洛谷](https://www.luogu.com.cn/problem/P8662)AC了, ```C++ #include <cstdio> #include <iostream> #include <vector> #include <functional> #include <string> using namespace std; int main() { int n; // scanf("%d", &n); cin >> n; vector<vector<char>> grid(n, vector<char>(n)); for (int i = 0; i < n; ++i) { // char tmp[n + 1]; string tmp; cin >> tmp; // scanf("%s", tmp); for (int j = 0; j < n; ++j) { grid[i][j] = tmp[j]; // cin >> grid[i][j]; // if (grid[i][j] == '\r' || grid[i][j] == '\n') // --j; } } int fx[4][2] = { {1, 0}, {-1, 0}, {0, -1}, {0, 1} }; int res = 0; // 一开始的岛屿数量 bool tag = 0; function<bool(int, int)> dfs = [&](int i, int j) { if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size()) return 0; if (grid[i][j] == '#') { grid[i][j] = '1'; // 标记为已经走过 for (auto& it : fx) { if (dfs(i + it[0], j + it[1])) // 四面临海 grid[i][j] = '2'; // 被淹没 } if (grid[i][j] == '1') tag = 0; // 没有完全被淹没 } else if (grid[i][j] == '.') { return 1; // 有海 } return 0; }; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (grid[i][j] == '#') { tag = 1; // 假设完全淹没了 dfs(i, j); if (tag) ++res; } printf("%d\n", res); // 被淹没 return 0; } ``` 这里插播一个坑: 就是不能统计原本和下沉后的岛屿数量然后做差: ```cpp #include <cstdio> #include <vector> #include <functional> using namespace std; int main() { int n; scanf("%d", &n); vector<vector<char>> grid(n, vector<char>(n)); for (int i = 0; i < n; ++i) { char tmp[n + 1]; scanf("%s", tmp); for (int j = 0; j < n; ++j) { grid[i][j] = tmp[j]; } } int fx[4][2] = { {1, 0}, {-1, 0}, {0, -1}, {0, 1} }; int res = 0; // 一开始的岛屿数量 function<bool(int, int)> dfs = [&](int i, int j) { if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size()) return 0; if (grid[i][j] == '#') { grid[i][j] = '1'; // 标记为已经走过 for (auto& it : fx) { if (dfs(i + it[0], j + it[1])) // 四面临海 grid[i][j] = '2'; // 被淹没 } } else if (grid[i][j] == '.') { return 1; // 有海 } return 0; }; function<void(int, int)> _dfs = [&](int i, int j) { if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size()) return; if (grid[i][j] == '1') { grid[i][j] = '0'; for (auto& it : fx) { _dfs(i + it[0], j + it[1]); } } }; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (grid[i][j] == '#') { ++res; dfs(i, j); } int fk = 0; // 还剩下 for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (grid[i][j] == '1') { ++fk; _dfs(i, j); } printf("%d\n", res - fk); // 被淹没 return 0; } // 坑 ``` 因为可能原本是一个岛屿的, 但是海水上升后, 变成两个岛: ```cin 8 ........ ........ ........ .###.##. .######. .###.##. ........ ........ ```
查看全文
1 0 0 82