[蓝桥杯][2018年第九届真题]全球变暖(BFS)

题目

你有一张某海域 N×NN×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......

其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 22 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。

具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

.......
.......
.......
.......
....#..
.......
.......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

输入格式

第一行包含一个整数N。

以下 NN 行 NN 列,包含一个由字符”#”和”.”构成的 N×NN×N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。

照片保证第 11 行、第 11 列、第 NN 行、第 NN 列的像素都是海洋。

输出格式

一个整数表示答案。

数据范围

1N10001≤N≤1000

输入样例1:

7
.......
.##....
.##....
....##.
..####.
...###.
.......

输出样例1:

1

输入样例2:

9
.........
.##.##...
.#####...
.##.##...
.........
.##.#....
.#.###...
.#..#....
.........

输出样例2:

思路

  • 要知道岛屿在哪,首先需要得知图中连通的像素,使用BFS遍历岛屿
  • 判断一个像素点是否是岛屿边界,就看它上下左右的四个元素中是否有“·”

需要注意的点

  • 遍历岛屿时需要判断:1)该点是否已超出边界 2)该点是否已被访问过 3)该点是“#”还是“·”
  • 控制方向,创建 dx[] = { -1,0,1,0 }, dy[] = { 0, 1, 0, -1 }两个数组,用一个for循环四次,依次为左上右下的次序。

代码

 

#include<iostream>
#include<queue>
#define MAXN 1001

using namespace std;
int n;
char img[MAXN][MAXN];
bool vis[MAXN][MAXN];
int dx[] = { -1,0,1,0 }, dy[] = { 0, 1, 0, -1 };
/*
7
.......
.##....
.##....
....##.
..####.
...###.
.......
*/

void bfs(int i, int j, int &sum, int &bound) {
    vis[i][j] = true;
    queue<pair<int, int>>q;
    pair<int, int> p(i, j);
    q.push(p);
    while (!q.empty()) {
        auto l = q.front();
        q.pop();
        sum++;
        bool is_bound = false;
        for (int k = 0; k < 4; k++) {
            int x = l.first + dx[k], y = l.second + dy[k];
            if (x > n || y > n || x < 0 || y < 0 || vis[x][y]==true)continue;
            else if (img[x][y] == '#') {
                vis[x][y] = true;
                p = make_pair(x, y);
                q.push(p);
            }
            else if (img[x][y] == '.') {
                is_bound = true;
            }
            
        }
        if (is_bound == true)bound++;
    }
}


int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> img[i][j];
        }
    }
    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (img[i][j] == '#' && vis[i][j] == false) {
                int sum = 0, bound = 0;
                bfs(i, j, sum, bound);
                if (sum == bound)count++;
            }
        }
    }
    cout << count;
    return 0;
}

 

posted @ 2020-03-25 23:38  champanesupernova  阅读(438)  评论(0编辑  收藏  举报