BZOJ4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III
Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of road
s, making it impossible for his cows to travel around without crossing many of them.
为什么牛过马路? 其中一个简单的原因就是农民约翰的农场有很多道路,使得他的母牛不得不穿越许多道路。
FJ's farm is arranged as an N×N square grid of fields (2 <= N <= 100), Certain pairs of adjacent fi
elds (e.g., north-south or east-west) are separated by roads, and a tall fence runs around the exter
nal perimeter of the entire grid, preventing cows from leaving the farm. Cows can move freely from a
ny field to any other adjacent field (north, east, south, or west), although they prefer not to cros
s roads unless absolutely necessary.
FJ的农场在N×N的网格中(2≤N≤100),某些相邻的区域(例如,南北或东西)由道路分隔,高大的围栏围绕着
整个格栅的外围,防止牛离开农场。 牛可以从任何场地自由移动到任何其他相邻的区域(北,东,南或西),不
过除非不得已,她们并不愿意穿越道路。
There are K cows (1 <= K <= 100, K <= N^2) on FJ's farm, each located in a different field. A pair o
f cows is said to be "distant" if, in order for one cow to visit the other, it is necessary to cross
at least one road. Please help FJ count the number of distant pairs of cows.
在FJ的农场有 K 头牛(1≤K≤100,K≤N^2),每个位于不同的区域。 定义一对牛是“遥远的”,是指让一头牛访
问另一头牛时,必须至少穿过一条路。 请帮助FJ计算有多少对牛是“遥远的”。
思路:这道题看着有些烦,实质上还是一道搜索题。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,k,r,sum; bool a[102][102][102][102]; int x[200],y[200]; bool h[200][200],b[200][200]; bool check(int x1,int y1) { h[x1][y1]=1; if ((x1>1)&&(!a[x1-1][y1][x1][y1])&&(!h[x1-1][y1])) { b[x1-1][y1]=1; check(x1-1,y1); } if ((x1<n)&&(!a[x1+1][y1][x1][y1])&&(!h[x1+1][y1])) { b[x1+1][y1]=1; check(x1+1,y1); } if ((y1>1)&&(!a[x1][y1-1][x1][y1])&&(!h[x1][y1-1])) { b[x1][y1-1]=1; check(x1,y1-1); } if ((y1<n)&&(!a[x1][y1+1][x1][y1])&&(!h[x1][y1+1])) { b[x1][y1+1]=1; check(x1,y1+1); } } int main() { ios::sync_with_stdio(false); int i,j,x1,x2,y1,y2; cin >> n >> k >> r; for (i=1; i <= r; i++) { cin >> x1 >> y1 >> x2 >> y2; a[x1][y1][x2][y2]=1; a[x2][y2][x1][y1]=1; } for (i=1; i <= k; i++) cin >> x[i] >> y[i]; for (i=1; i < k; i++) { memset(b,0,sizeof(b)); memset(h,0,sizeof(h)); check(x[i],y[i]); for (j=i+1; j <= k; j++) { if (!b[x[j]][y[j]]) sum++; } } cout << sum << endl; return 0; }