ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛为什么过马路III--Why Did the Cow Cross the Road III-BFS

2020-11-12 16:34:20  阅读:213  来源: 互联网

标签:RR Cow -- KK maxn cows 100 III FJ


题目描述

Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of roads, making it impossible for his cows to travel around without crossing many of them.

为什么牛过马路? 其中一个简单的原因就是农民约翰的农场有很多道路,使得他的母牛不得不穿越许多道路。

FJ's farm is arranged as an N \times NN×N square grid of fields (2 \leq N \leq 1002≤N≤100), Certain pairs of adjacent fields (e.g., north-south or east-west) are separated by roads, and a tall fence runs around the external perimeter of the entire grid, preventing cows from leaving the farm. Cows can move freely from any field to any other adjacent field (north, east, south, or west), although they prefer not to cross roads unless absolutely necessary.

FJ的农场在 N\times NN×N的网格中( 2\le N\le 1002≤N≤100),某些相邻的区域(例如,南北或东西)由道路分隔,高大的围栏围绕着整个格栅的外围,防止牛离开农场。 牛可以从任何场地自由移动到任何其他相邻的区域(北,东,南或西),不过除非不得已,她们并不愿意穿越道路。

There are KK cows (1 \leq K \leq 100, K \leq N^21≤K≤100,K≤N
2
) on FJ's farm, each located in a different field. A pair of 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的农场有 KK 头牛(1\le K\le 100,K\le N^{2}1≤K≤100,K≤N
2
),每个位于不同的区域。 定义一对牛是“遥远的”,是指让一头牛访问另一头牛时,必须至少穿过一条路。 请帮助FJ计算有多少对牛是“遥远的”。

输入格式

The first line of input contains NN, KK, and RR. The next RR lines describe RR roads that exist between pairs of adjacent fields. Each line is of the form rr cc r'r

c'c

(integers in the range 1 \ldots N1…N), indicating a road between the field in (row rr, column cc) and the adjacent field in (row r'r

, column c'c

). The final KK lines indicate the locations of the KK cows, each specified in terms of a row and column.

第一行输入包含 NN, KK和 RR。 接下来的 RR 行描述存在于相邻区域对之间的 RR 条路。 每行的格式为 rr ; cc ; r'r

; c'c

(都是在 1...N1...N中的整数),表示在两个相邻的区域(第rr行第cc列,和第r​'r​

​​ 行第c​'c​

​​ 列)之间的路。 最终的KK行表示 KK 头牛的位置,也用行列来表示。

输出格式

Print the number of pairs of cows that are distant.

输出遥远的牛数量对。

输入输出样例

输入 #1 复制
3 3 3
2 2 2 3
3 3 3 2
3 3 2 3
3 3
2 2
2 3
输出 #1 复制
2


思路

  • bfs,标记每一堵墙

代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=103;
int n,k,r,fx[4][2]={{0,1},{0,-1},{-1,0},{1,0}},num,ans;
bool cow[maxn][maxn],tag[maxn][maxn],flag[maxn][maxn][4];//0up 1down 2left 3right
struct fdfdfd{int x,y;}e[maxn<<1];
void bfs(int stax,int stay)
{
	num=0; tag[stax][stay]=1;
	queue<fdfdfd> q; q.push((fdfdfd){stax,stay});
	while(!q.empty())
	{
		int tx=q.front().x,ty=q.front().y;
		if(cow[tx][ty]) ++num;
		for(int i=0;i<4;++i)
		{
			int nowx=tx+fx[i][0],nowy=ty+fx[i][1];
			if(nowx>=1&&nowx<=n&&nowy>=1&&nowy<=n&&!flag[tx][ty][i]&&!tag[nowx][nowy])
				q.push((fdfdfd){nowx,nowy}),tag[nowx][nowy]=1;
		}
		q.pop();
	}
}
int main()
{
	scanf("%d%d%d",&n,&k,&r);
	for(int i=1,t1,t2,t3,t4;i<=r;++i)
	{
		scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
		if(t1==t3)
		{
			if(t2<t4) swap(t2,t4);
			flag[t1][t2][1]=flag[t3][t4][0]=1;
		}
		else
		{
			if(t1>t3) swap(t1,t3);
			flag[t1][t2][3]=flag[t3][t4][2]=1;
		}
	}
	for(int i=1;i<=k;++i) scanf("%d%d",&e[i].x,&e[i].y),cow[e[i].x][e[i].y]=1;
	for(int i=1;i<=k;++i)
	{
		memset(tag,0,sizeof(tag));
		bfs(e[i].x,e[i].y);
		ans+=k-num;
	}
	cout<<ans/2<<"\n";
	return 0;
}

标签:RR,Cow,--,KK,maxn,cows,100,III,FJ
来源: https://www.cnblogs.com/wuwendongxi/p/13964596.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有