标题:全球变暖
你有一张某海域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;
}