P1506 拯救oibh总部题解

知识点:dfs

很明显的连通块

 

em……转载于P1506 拯救oibh总部题解 - qianyangyi 的博客 - 洛谷博客 (luogu.com.cn)​​​​​​

(搞得好像很多人看一样 

思路:每遇到一个没有访问过的点,就进行dfs,如果是重要区域cnt++,是围墙return,是边界则说明围墙不封闭,则本次dfs的cnt清零

看起来挺简单的,细节比较多,多注意

#include <iostream>
#include <cstring>//memset头文件 
using namespace std;
int a[505][505],cnt;
bool ct;
void dfs(int x,int y){
	if(a[x][y]==0) return;//围墙或访问过的清零 
	if(a[x][y]==-1){//dfs到说明围墙不封闭 
		ct=1;//标记,本次cnt作废 
		return;
	} 
	cnt++;
	a[x][y]=0;//避免二次访问 
	dfs(x+1,y);//四个方向 
	dfs(x,y+1);
	dfs(x-1,y);
	dfs(x,y-1);
	return;
}
int main(){
	int n,m;
	cin>>n>>m;
	char c;
	memset(a,-1,sizeof(a));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>c;//这里也可以不转换,直接char a[500][500]; 
			if(c=='0') a[i][j]=1;
			else if(c=='*') a[i][j]=0;
		}
	}
	int ans=0;//答案 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				cnt=ct=0;//每次计数器和判断器清零,防止被上组数据影响 
				dfs(i,j);//dfs 
				if(ct!=1) ans+=cnt;//如果围墙是封闭的,则cnt加入ans里 
			} 
		}
	}
	cout<<ans<<endl;//输出
	return 0; 
} //完结撒花 

本蒟蒻写题解不易 给个赞不过分吧qwq

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值