#include <bits/stdc++.h>
#define pan tx-1>=0&&tx+1<n&&ty-1>=0&&ty+1<n
using namespace std;
char a[1001][1001];
int vis[1001][1001] = {0};//保证每块地只搜索一次,避免进入死循环
int n,flag,ans = 0;
int bfs(int i,int j)
{
queue<pair<int ,int> > qe;
vis[i][j] = 1;
qe.push({i,j});
while(qe.size())
{
pair<int ,int> t = qe.front();
qe.pop();
int tx = t.first , ty = t.second;
if(pan)
{
if(a[tx-1][ty]=='#'&&a[tx+1][ty]=='#'&&a[tx][ty-1]=='#'&&a[tx][ty+1]=='#')
flag = 1;//证明这个岛屿不会被淹没
}
if(tx-1>=0&&vis[tx-1][ty]==0&&a[tx-1][ty]=='#')
{
vis[tx-1][ty] = 1;
qe.push({tx-1,ty});
}
if(tx+1<n&&vis[tx+1][ty]==0&&a[tx+1][ty]=='#')
{
vis[tx+1][ty] = 1;
qe.push({tx+1,ty});
}
if(ty-1>=0&&vis[tx][ty-1]==0&&a[tx][ty-1]=='#')
{
vis[tx][ty-1] = 1;
qe.push({tx,ty-1});
}
if(ty+1<n&&vis[tx][ty+1]==0&&a[tx][ty+1]=='#')
{
vis[tx][ty+1] = 1;
qe.push({tx,ty+1});
}
}
return 0;
}
int main ()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(vis[i][j]==0&&a[i][j]=='#')
{
flag = 0;
bfs(i,j);
if(!flag) ans++;
}
}
}
cout<<ans;
return 0;
}
1、总体思路就是运用了BFS搜索,即一层层弥撒开。
2、状态数组vis的使用,保证了每次从main函数访问陆地时都是新的一个岛屿,并且保证dfs函数不会陷入死循环。
3、下雨天,BFS与队列数据结构更配哦!dfs搜索过程中,不断取出队首的元素,并将队首的“亲戚”放入队列中,当队列为空时,即代表一次dfs搜索结束。
做题链接:全球变暖 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/178/learning/