题目问答
题目问答简介
好像评测的输入有问题?
无论我采用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



