蓝桥杯 全球变暖 简单写法 详细易懂

@蓝桥杯 全球变暖 简单写法 超详细

题目链接:全球变暖

思路:

 **这道的大致写法就是用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;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值