DFS连通性

这两篇文章分别展示了深度优先搜索(DFS)在解决迷宫路径联通问题和计算二维矩阵中特定字符连通块大小的应用。第一篇通过DFS判断起点到终点在给定迷宫中是否可达,第二篇则利用DFS计算出红色或黑色字符形成的连通区域的大小。
摘要由CSDN通过智能技术生成

迷宫

1112. 迷宫 - AcWing

        起点到终点是否联通

#include<bits/stdc++.h>
using namespace std;
#define fast(); ios::sync_with_stdio(false);cin,tie(0),cout.tie(0);
typedef long long ll;
typedef pair<int,int> PII;
const int N=105;
int n;
char w[N][N];
PII st,ed;
bool vis[N][N];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
bool dfs(int x,int y){
	if(x==ed.first&&y==ed.second) return true;
	vis[x][y]=true;
	for(int i=0;i<4;i++){
		int nx=x+dx[i],ny=y+dy[i];
		if(nx<1||ny<1||nx>n||ny>n) continue;
		if(w[nx][ny]=='#') continue;
		if(vis[nx][ny]) continue;
		if(dfs(nx,ny)) return true;
	}
	return false;
}
int main(){
	int t;cin>>t;
	while(t--){
		cin>>n;		
		for(int i=1;i<=n;i++){
			cin>>w[i]+1;
		}
		int a,b,c,d;cin>>a>>b>>c>>d;
		st={a+1,b+1};ed={c+1,d+1};
		if(w[st.first][st.second]=='#'||w[ed.first][ed.second]=='#'){
			cout<<"NO"<<endl;
			continue;
		}
		memset(vis,false,sizeof vis);
		if(dfs(st.first,st.second)) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
} 

红与黑

1113. 红与黑 - AcWing题库

        连通块大小

#include<iostream>
#include<cstring>
using namespace std;
const int N=25;
int n,m;
char a[N][N];
bool vis[N][N];
int nx[]={0,0,-1,1};
int ny[]={1,-1,0,0};
int dfs(int x,int y)
{
	int cnt=1;
	vis[x][y]=true;
	for(int i=0;i<4;i++){
		int dx=x+nx[i],dy=y+ny[i];
		if(dx<1||dy<1||dx>n||dy>m) continue;
		if(vis[dx][dy]) continue;
		if(a[dx][dy]!='.') continue;
		cnt+=dfs(dx,dy);
	}
	return cnt;
}
int main()
{
	while(cin>>m>>n&&m&&n)
	{
		memset(vis,0,sizeof vis);
		int x,y;
		for(int i=1;i<=n;i++) cin>>a[i]+1;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(a[i][j]=='@')
				{
					x=i,y=j;break;
				}
		cout<<dfs(x,y)<<endl;		
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vic.GoodLuck

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值