2018蓝桥杯省赛-B组C++第9题 搜索

题目分享链接
密码:7m4a

标题:全球变暖

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

…….
.##….
.##….
….##.
..####.
…###.
…….

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

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

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

…….
…….
…….
…….
….#..
…….
…….

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

【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。

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

【输出格式】
一个整数表示答案。

【输入样例】
7
…….
.##….
.##….
….##.
..####.
…###.
…….

【输出样例】
1

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

比赛的时候是,bfs便利每个岛屿,用一个变量记录不会被淹没的岛屿数量,然后用总岛屿数量减去不会被淹没的岛屿数量。就是被淹没岛屿的数量。

比赛时,没考虑。
这里写图片描述
这种情况,不过发现自己的代码可以通过,真是侥幸。不过下来,我听到别人的做法是用BFS统计岛屿数量,然后循环把岛屿淹没,最后再统计剩下的岛屿数量。这样的做法,就通不过这组样例了。

下面时我新写的代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 1010;
typedef pair<int,int> P;
char Map[MAX][MAX];
bool used[MAX][MAX];
const int xx[] = {0,1,0,-1};
const int yy[] = {1,0,-1,0};
int N;
bool BFS(int x,int y){
    queue<P> que;
    que.push(make_pair(x,y));
    int FloodCount = 0,SumCount = 0;
    //统计这个岛屿所有陆地,和能被淹没的陆地
    while(!que.empty()){
        P v = que.front();que.pop();
        SumCount++;
        used[v.first][v.second] = true;
        bool CanFlood = false;
        for(int i=0;i<4;++i){
            int tx = v.first + xx[i];
            int ty = v.second + yy[i];
            if(tx < 1 || ty < 1 || tx > N || ty > N)
                continue;
            if(!used[tx][ty] && Map[tx][ty] == '#'){
                que.push(make_pair(tx,ty));
            }
            else if(Map[tx][ty] == '.'){
                CanFlood = true;
            }
        }
        if(CanFlood)    FloodCount++;
    }
    if(FloodCount == SumCount)
        return true;
    else
        return false;
}
void solve(){
    memset(used,false,sizeof(used));
    int res = 0;
    for(int i=1;i<=N;++i){
        for(int j=1;j<=N;++j){
            if(!used[i][j] && Map[i][j] == '#'){
                if(BFS(i,j))    res++;
            }
        }
    }
    cout << res << endl;
}
int main(void){
    cin >> N;
    for(int i=1;i<=N;++i){
        for(int j=1;j<=N;++j){
            cin >> Map[i][j];
        }
    }
    solve();




    return 0;
}

感觉今年不是暴力杯啊。。

猜你喜欢

转载自blog.csdn.net/zhao5502169/article/details/79782000
今日推荐