P3663 [USACO17FEB]Why Did the Cow Cross the Road III S

该博客介绍了USACO竞赛中的一道题目,通过深度优先搜索(DFS)解决寻找连通块的问题。作者提到题目相对简单,属于 luogu 的绿标级别。文章详细分析了如何使用四维布尔数组表示道路,并通过DFS进行连通块的搜索。最后给出了代码实现。
摘要由CSDN通过智能技术生成

题目传送门
前言:本题用深搜或者广搜都可以,而且算是比较水的一道题,luogu绿标,蒟蒻在这里分享一种深搜的做法。
分析:本题主要是求连通块。对于路的处理,可以用一个四维的bool数组road[u1][v1][u2][v2]来保存是否有路,其中u1,u2表示有路联通的两个小区域的横坐标,v1,v2表示这两个小区域的纵坐标,注意:因为是无向图,所以road[u1][v1][u2][v2] = road[u2][v2][u1][v1]。保存好路的位置之后就可以用深搜去暴力搜索连通块了,当判断两个相邻区域,x1,y1,x2,y2是否可以直接连通时,即判断是否跃出界限与road[x1][y1][x2][y2]是否为1,求好连通块后,暴力求解牛与牛之间是否处在不同连通块内,结果相加,便可以得到答案。

代码:
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAXN = 105;
bool road[MAXN][MAXN][MAXN][MAXN];
int n,k,r,u1,v1,u2,v2,map[MAXN][MAXN],v,ans;
int cow_x[MAXN * MAXN],cow_y[MAXN * MAXN];
bool check(int x1,int y1,int x2,int y2) {
	if(x2 < 1 || y2 < 1 || x2 > n || y2 > n || road[x1][y1][x2][y2] || map[x2][y2])
	return false;
	return true;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值