问题描述
标题:全球变暖
你有一张某海域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(判断一个地图中有几块连着的区域)
代码展示
#include <bits/stdc++.h>
using namespace std;
int n;//地图的长和宽
const int maxn=1000;//n的最大取值
char maze[maxn][maxn];
//结构提记录位置和步数
struct node{
int x,y;//位置(x,y)
}S,T,Node;// S为起点,T为终点,Node为临时结点
bool inq[maxn][maxn]={false};//记录位置(x,y)是否已经入过队
int X[4]={1,0,0,-1}; //增量数组,上左右上并保证字典序最小
int Y[4]={0,-1,1,0};
//检测位置(x,y)是否有效
bool test(int x,int y){
if(x>=n||x<0||y>=n||y<0) return false;//超过边界,必须有
//if(maze[x][y]=='1') return false;//墙壁
if(maze[x][y]=='.' || maze[x][y]=='o') return false;
if(inq[x][y]== true) return false;//已入过队
return true; //有效位置
}
void BFS(int x,int y){
S.x=x;
S.y=y;
queue<node> q; //定义队列
q.push(S); //将起点S入队
while(!q.empty()){
node top=q.front(); //输出队首元素
q.pop(); //队首元素出队
for(int i=0;i<4;i++){ //循环四次得到四个相邻位置
int newX=top.x+X[i];
int newY=top.y+Y[i];
if(test(newX,newY)){
//位置node的坐标是(newX,nodeY)
Node.x=newX;
Node.y=newY;
//Node.step=top.step+1;//Node层数为top的层数加1
q.push(Node); //将结点Node加入队列
inq[newX][newY]=true; //设置位置(newX,newY)已入队
}
}
}
// return -1;//无法到达T时返回-1
}
int main(){
int num1=0,num2=0;
scanf("%d",&n); //地图的长和宽
//输入地图
for(int i=0;i<n;i++){
getchar();//过滤掉每行后面的换行符
for(int j=0;j<n;j++){
maze[i][j]=getchar();
}
}
//记录没有淹没前的陆地数
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(maze[i][j]=='#' && inq[i][j]== false){
BFS(i,j); //通过使用bfs算法将连着的陆地标记为‘0’
num1=num1+1; //记录陆地的个数
}
}
}
//将陆地进行淹没
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(maze[i][j]=='#' && (maze[i][j-1]=='.' || maze[i][j+1]=='.' || maze[i-1][j]=='.' || maze[i+1][j]=='.')){
maze[i][j]='o';
}
}
}
//记录淹没后的陆地数
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
inq[i][j]= false;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(maze[i][j]=='#' && inq[i][j]== false){
BFS(i,j); //通过使用bfs算法将连着的陆地标记为‘0’
num2=num2+1; //记录陆地的个数
}
}
}
printf("%d后 %d\n",num1,num2);
printf("%d",num1-num2);
return 0;
}
注意事项
1.有关地图的必须有判断边界是否越界
2.在写将陆地进行淹没的代码中
这一块不能设置成和那两种相同的,你想如果这样设置的话会全部淹没