奶牛贝茜和奶牛贝蒂各有一个整数数对。

每个数对都包含两个 1∼9 之间的不同整数。

这两个数对恰好包含一个公共数,即恰好有一个整数同时包含于这两个数对。

初始时,贝茜和贝蒂都只知道自己拥有的数对,而不清楚对方拥有的数对。

它们希望通过网络交流来获知彼此数对的公共数。
但是,它们清楚所有交流信息一定会被农夫约翰截获,且约翰也知道这两个数对恰好包含一个公共数。

为了让截获到交流信息的约翰无法获知这个公共数,它们决定采用如下方式加密信息。

贝茜会准备 n 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,其中一个数对恰好是它拥有的数对,它会将这些数对全部发送给贝蒂。

贝蒂会准备 m 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,其中一个数对恰好是它拥有的数对,它会将这些数对全部发送给贝茜。

当然,约翰会将这些数对(以及是谁发送的)全部获知。

请你对给定信息进行判断,并按要求输出

  • 如果这些信息足以令约翰准确地推断出公共数字,则输出这个公共数字。
  • 如果这些信息不足以令约翰准确地推断出公共数字,但是不论两头奶牛各自拥有哪个数对,都足以令两头奶牛都准确地推断出公共数字,则输出 0。
  • 以上都不是,则输出 -1。

输入格式

  • 第一行包含两个整数 n,m。

  • 第二行包含 n 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,表示贝茜准备的数对。

  • 第三行包含 m 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,表示贝蒂准备的数对。

在本题中,(1,2) 和 (2,1) 视为同一数对。

数据保证双方拥有的数对包含于各自给出的数对当中,且双方拥有的数对恰好包含一个公共数。

输出格式

按照题目要求,输出公共数字或 0 或 -1。

输入样例1:

 2 2
 1 2 3 4
 1 5 3 4

输出样例1:

 1

输入样例2:

 2 2
 1 2 3 4
 1 5 6 4

输出样例2:

 0

输入样例3:

 2 3
 1 2 4 5
 1 2 1 3 2 3

输出样例3:

 -1

数据范围与提示

前 4 个测试点满足 1≤n,m≤3。
所有测试点满足 1≤n,m≤12。

正解

理解题意后发现一共会出现三种情况:

  1. 农夫和奶牛都能得知公共数字,这是输出该数字;
  2. 农夫不知道,但奶牛知道公共数字,输出0;
  3. 农夫和奶牛都不能得知公共数字,输出-1;

有没有农夫知道但奶牛不知道公共数字的情况:

因为奶牛知道它本身的数对,而农夫的信息少,如果农夫可以推出公共数字,那么奶牛一定也知道,所以只有三种情况,

所以我们用ans[2]中三个变量记录答案:

ans[0]存的是三种情况,分别对应1,大于1,小于1(等下再解释为什么这么对应),ans[1]存要输出的公共数字(不输出公共数字的情况就不用管它了);

ACcode
#include<bits/stdc++.h>
using namespace std;
int n,m,ans[2];//ans存输出 
int x[19],y[19];//分别存两头牛数对和其他数对对应的次数 
struct par{
	int x,y;
}bx[19],bd[19];//存两头牛准备好的数对 
void cys(int in,int i,int j){
	//如果ans[1]不等于要更新的in,说明有多个公共数字可以对应 
	if(ans[1]!=in){
		ans[0]++;
		//更新数对的对应次数 
		x[i]++;
		y[j]++;
	}
	ans[1]=in;//更新当前的公共数字
}
int main(){
	scanf("%d%d",&n,&m);
	//读入两头牛的数对 
	for(int i=1;i<=n;i++) scanf("%d%d",&bx[i].x,&bx[i].y);
	for(int i=1;i<=m;i++) scanf("%d%d",&bd[i].x,&bd[i].y);
	//将所有数对一一对应,找出符合条件的更新数字(数据范围不到20,放心套循环) 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			//两头牛的原始数对只有1个数相同,另一个不同,找出这种情况进行更新 
			if(bx[i].x==bd[j].x&&bx[i].y!=bd[j].y) cys(bx[i].x,i,j);
			if(bx[i].x!=bd[j].x&&bx[i].y==bd[j].y) cys(bx[i].y,i,j);
			if(bx[i].x==bd[j].y&&bx[i].y!=bd[j].x) cys(bx[i].x,i,j);
			if(bx[i].x!=bd[j].y&&bx[i].y==bd[j].x) cys(bx[i].y,i,j);
			//如果同一个数对与别的数对对应次数超过1
			//说明拿这个原始数对的奶牛无法推断公共数字在哪个数对里
			//符合第三种情况,把ans[0]赋为负数 
			if(x[i]>1||y[j]>1) ans[0]=-32767;
		}
	}
	//只有一对数对有唯一的公共数字,农夫可以推断出 
	if(ans[0]==1) printf("%d\n",ans[1]);
	//有多对数对出现公共数字 ,但不同数对的公共数字不同
	//奶牛可以通过自己的原始数对推断出公共数字,但农夫不行 
	else if(ans[0]>1) printf("0");
	//同一个数对里的两个数都能与别的某个数对存在公共数字
	//奶牛和农夫都无法推断公共数字,输出-1 
	else if(ans[0]<1) printf("-1");
	return 0;
}

第一次自己写题解,感谢各位神犇的支持!
对了,这是传送门