题目分享链接
密码: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;
}
感觉今年不是暴力杯啊。。