当前位置: 代码迷 >> 综合 >> in2021_第九届蓝桥杯大赛个人赛省赛(软件类)真题\LanqiaoCB\C语言B组\9_全球变暖_做题笔记
  详细解决方案

in2021_第九届蓝桥杯大赛个人赛省赛(软件类)真题\LanqiaoCB\C语言B组\9_全球变暖_做题笔记

热度:2   发布时间:2024-01-21 19:52:29.0

标题:全球变暖

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

题目略。

解题思路:详见代码段中注释。

#include <iostream>
#include <string.h>using namespace std;int G[1000][1000];
int vis[1000][1000];
int N;
int dir[4][2]={
   {-1,0},{0,1},{1,0},{0,-1}};//四周上、右、下、左void Read(){cin>>N;for(int i=0;i<N;i++){for(int j=0;j<N;j++){char c;cin>>c;if(c=='.')G[i][j]=0;//0:.海洋elseG[i][j]=1;//1:#陆地}}
}void PrintG(){for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<G[i][j]<<" ";cout<<endl;}
}void searhAround(int x,int y){//第x行y列//图G,自上而下,0~N-1//向四周遍历,若有海洋则淹没本地,G[x][y] =2,防止重复赋值for(int i=0;i<4;i++){int nextX=x+dir[i][0];int nextY=y+dir[i][1];if(G[nextX][nextY]==0){G[x][y]=2;break;}}
}void flooding(){//模拟海洋淹没陆地for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(G[i][j]==1)searhAround(i,j);}}
}void dfs(int x,int y){//dfs遍历搜索陆地构成岛屿vis[x][y]=1;for(int i=0;i<4;i++){int nextX=x+dir[i][0];int nextY=y+dir[i][1];if(G[nextX][nextY]==1 && vis[nextX][nextY]==0)dfs(nextX,nextY);}
}int getIslands(){int cnt=0;memset(vis,0,sizeof(vis));for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(G[i][j]==1 && vis[i][j]==0){dfs(i,j);cnt++;}}}return cnt;
}int main()
{Read();int initIslands=getIslands();flooding();int finalIslands=getIslands();cout<<(initIslands-finalIslands)<<endl;return 0;
}