格式要求:
样例:
题解:题目的关键 是如何判断一个连通块(岛屿) 采用深搜
#include<iostream>
using namespace std;
int n;
//地图数组
char map[1010][1010];
//标记是否搜过的数组
int vis[1010][1010]={0};
//四个方向 上右下左
int d[4][2] = {{0,-1},{1,0},{0,1},{-1,0}};
//用于标记这个岛中是否被完全淹没
int flag = 0;
void dfs(int x, int y){
//标记这个'#'被搜过。
vis[x][y] = 1;
//上下左右四个方向都是陆地,该‘#’不会淹没
if(map[x][y+1]=='#' && map[x][y-1]=='#' && map[x+1][y]=='#' && map[x-1][y]=='#'){
//即该‘#’所在的岛屿不会被淹没
flag = 1;
}
//继续深搜周围的陆地 四个方向
for(int i = 0; i < 4; i++){
int nx = x + d[i][0], ny = y + d[i][1];
//继续DFS未搜过的陆地,目的是标记它们
if(vis[nx][ny]==0 && map[nx][ny]=='#')
dfs(nx,ny);
}
}
int main(){
cin >> n;
//读入地图
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> map[i][j];
//会被淹没的岛屿数量
int ans = 0 ;
//DFS所有像素点
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
//没有被搜过且是‘#’
if(map[i][j]=='#' && vis[i][j]==0){
flag = 0;
//深搜这个'#'所在岛
dfs(i,j);
//这个岛全部被淹
if(flag == 0){
//会被淹没的岛屿数量加1
ans++;
}
}
cout<<ans<<endl;
return 0;
}