题干:
自己去百度吧,不记得题目了。
题目分析:
(1)先用广搜(bfs)搜索出一共有多少个岛屿
(2)然后对每个岛屿的‘#’进行处理,即搜索‘#’上下左右四个方向有没有海,如果没有海,那么这个岛屿就不会被淹没
代码如下:
#include <iostream> #include <queue> using namespace std; char Map[1005][1005]; int vis[1005][1005]; int vis1[1005][1005]; typedef struct node { int x;int y; }Node; typedef struct record { int x;int y; }Record; int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}}; int n; void bfs(int i,int j) { queue<Node> q; Node n1; n1.x=i;n1.y=j; q.push(n1); vis[i][j]=1; while(!q.empty()){ Node nn=q.front(); q.pop(); int x=nn.x; int y=nn.y; for(int i=0;i<4;i++){ int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(xx>0 && xx<n && yy>0 && yy<n && Map[xx][yy]=='#' && vis[xx][yy]==0){ vis[xx][yy]=1; Node tmp; tmp.x=xx; tmp.y=yy; q.push(tmp); } } } } bool is(Record &r1) { queue<Node> q; Node n1; int sum=0; n1.x=r1.x;n1.y=r1.y; q.push(n1); vis1[r1.x][r1.y]=1; while(!q.empty()){ Node nn=q.front(); q.pop(); int x=nn.x; int y=nn.y; //cout<<x<<" "<<y<<endl; for(int i=0;i<4;i++){ int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(xx>0 && xx<n && yy>0 && yy<n && Map[xx][yy]=='#' && vis1[xx][yy]==0){ vis1[xx][yy]=1; Node tmp; tmp.x=xx; tmp.y=yy; q.push(tmp); } } bool judge=true; for(int i=0;i<4;i++){ int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(Map[xx][yy]=='.'){ judge=false; } } if(judge){ sum++; } } //cout<<sum<<endl; if(sum<=0){ return false; } else{ return true; } } int main() { int sum2=0; cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>Map[i][j]; } } int cnt=0; Record r[1005]; for(int i=1;i<n-1;i++){ for(int j=1;j<n-1;j++){ if(Map[i][j]=='#' && vis[i][j]==0){ r[cnt].x=i;r[cnt++].y=j; bfs(i,j); } } } /*for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cout<<vis[i][j]<<" "; } cout<<endl; }*/ for(int i=0;i<cnt;i++){ if(is(r[i])){ sum2++; } } cout<<sum2<<endl; return 0; }