蓝桥集训之全球变暖
-
核心思想:bfs/dfs 搜索连通块
- 判断连通块中是否所有点都是边界 / 找有无四个方向都是陆地的点
-
#include<bits/stdc++.h>using namespace std;const int N = 1010;typedef pair<int,int> PII;int n;char g[N][N];int hh,tt; //队列PII q[N*N];bool st[N][N];int dx[4] = {-1, 0, 1, 0};int dy[4] = {0, 1, 0, -1};bool bfs(int x,int y){int hh=0,tt=0; //每个连通块重置一次q[0] = {x,y};bool is_high = false; //是否有高地st[x][y] = true;while(hh<=tt){auto t = q[hh++];bool flag = true; //是否为边界for(int i=0;i<4;i++){int a = t.first + dx[i] , b = t.second + dy[i];if(st[a][b]) continue;if (a < 0 || a >= n || b < 0 || b >= n) continue;if(g[a][b] == '.'){flag = false; //是边界continue;}q[++tt] = {a,b}; //有下一块陆地 放进去st[a][b] = true; }if(flag) is_high = true; //该点不是边界 说明是高地 不能直接return 坚持搜完连通块}if(is_high) return true;return false;}int main(){cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>g[i][j];int res = 0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(!st[i][j] && g[i][j] == '#') //找到下个连通块if(!bfs(i,j)) res++;cout<<res;}