题目描述
你有一张某海域 N×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。
具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数N
以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N × N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋
照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
输出格式
一个整数表示答案。
数据范围
1 ≤ N ≤ 1000
【样例输入】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【样例输出】
1
思路
遍历整个图片,遇到陆地‘#’则进入dfs搜索,并将已访问过的坐标标记为‘&’;
在dfs中要做这么几件事情:1.判断传入的坐标是否越界,越界则返回;2.判断该坐标位置是否是陆地且未被访问过,不是陆地或已被访问过则返回;3.若到达的是一块未被访问过的陆地,则将其标记为代表访问过的符号‘&’,并判断该坐标是否会沉没,然后分上下左右四个方向继续进行搜索。
题解
#include <iostream>
#include <vector>
using namespace std;
int sinking; //用于判断该岛屿是否会沉没
void dfs(vector<vector<char>>& grid, int i, int j);
bool inArea(vector<vector<char>>& grid, int i, int j);
int main()
{
int k;
cin >> k;
vector<vector<char>> grid(k,vector<char>(k));
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
char c;
cin >> c;
if (c == '\n') {
j--;
continue;
}
grid[i][j] = c;
}
}
int ans = 0;
int cnt = 0;
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
sinking = 1;
if (grid[i][j] == '#') {
cnt++;
dfs(grid, i, j);
if (sinking == 1) {
ans++;
}
}
}
}
//cout << "起始岛屿数量:" << cnt << endl;
cout << ans;
}
void dfs(vector<vector<char>>& grid, int i, int j)
{
if (!inArea(grid, i, j)) {
return;
}
if (grid[i][j] != '#') {
return;
}
grid[i][j] = '&';
bool flag = true;
//如果四个方向中相邻的有海域,则这个坐标的陆地会沉没
if (inArea(grid, i - 1, j) && grid[i - 1][j] == '.') flag = false;
if (inArea(grid, i + 1, j) && grid[i + 1][j] == '.') flag = false;
if (inArea(grid, i, j - 1) && grid[i][j - 1] == '.') flag = false;
if (inArea(grid, i, j + 1) && grid[i][j + 1] == '.') flag = false;
//如果上下左右都是陆地,则该坐标不会沉没,进而该坐标所在的岛屿会有保留的部分
if (flag) {
sinking = 0;
}
dfs(grid, i - 1, j);
dfs(grid, i + 1, j);
dfs(grid, i, j - 1);
dfs(grid, i, j + 1);
}
bool inArea(vector<vector<char>>& grid, int i, int j)
{
return i >= 0 && i < grid.size() && j >= 0 && j < grid[0].size();
}