@蓝桥杯 全球变暖 简单写法 超详细
题目链接:全球变暖
思路:
**这道的大致写法就是用dfs将各个岛屿先编号(vis值)作为t,
编完号之后将上下左右有' . '这个字符的' # '的vis值改为0,
之后遍历整个字符数组,查找还剩几个vis数不为0,作为 h(当然不能重复计算)
再用t-h+1(为什么要加1?因为有些vis值一开始就是0)
那么下面就是具体代码,具体请看注释**
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int n,t,h,res[N],vis[N][N];/*t记录一开始有多少块岛屿,h记录之后的,
res数组是帮助记录h的,vis记录t*/
char a[N][N];
int dx[4]={0,1,0,-1};//上下左右
int dy[4]={1,0,-1,0};
bool Check(int x,int y){//判断有无出界
if(x>n||x<=0||y>n||y<=0)
return false;
return true;
}
void dfs(int x,int y,int t){//主要dfs代码
if(a[x][y]!='#'||vis[x][y]!=0)//如果不是陆地或者已经遍历过就返回
return ;
if(!Check(x,y))//如果出界就返回
return ;
vis[x][y]=t;//将这个陆地的vis赋值
for(int i=0;i<=3;i++)//上下左右遍历
dfs(x+dx[i],y+dy[i],t);//继续找
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]=='#'&&!vis[i][j])//如果为陆地且没有遍历过
dfs(i,j,++t);//发现新大陆,就是t就++(比如上一块大陆为2,这里就是3)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]=='#'){
for(int k=0;k<=3;k++)//这里无需判断是否出界,题目说了1和n的行,列必为' . '
if(a[i+dx[k]][j+dy[k]]=='.'){//如果找到这个陆地旁边是海
vis[i][j]=0;//将他的vis值改为0
break;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]=='#')
if(!res[vis[i][j]]){//如果这块大陆还没消失,就h++
h++;
res[vis[i][j]]=1;//假设让他“消失”,不然会重复
}
cout<<t-h+1;
return 0;
}