题目传送门
前言:本题用深搜或者广搜都可以,而且算是比较水的一道题,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;