题解
可以发现,只有当一位测试者(设其为甲)的1对数字同时可以与另一位测试者(设其为乙)的2个在不同对中的数字相等时,乙无法确定甲的数字,应输出-1。而当甲有\(>1\)个在不同对中的数字与乙的\(>1\)个在不同对中的数字相等时,我们无法确定他们的数字,应输出0。若不符合上述条件,则输出甲、乙中唯一一个相等且在不同对的数字即可。
具体实现:可以将甲、乙的数字分别存入两个下标从\(0\)开始的数组,与下表为\(i\)的数在同一数对中的数下标为\(i^{\wedge} 1\),这样不用将数对中的数分开处理。注意当数据同时满足-1和0的条件时,-1的优先级大于0的优先级,因此需存储当前满足的条件,最后输出。此外,相同数字可能会在同一人的不同数对中出现多次,需判断。甲、乙是否可以判断需分两次处理,因为可能会出现一方无法判断的情况(如题目样例3)。
#include<bits/stdc++.h>
using namespace std;
const int N=30;
int a[N],b[N];
bool pa[N],pb[N]; //pa/pb[i]:a/b数组中下标为i的元素是否(1/0)在b/a数组中有相同的数字
int main()
{
int n,m,ans=0;
bool qwq=0,qaq=0;//qwq/qaq:是否(1/0)满足-1/0的条件
scanf("%d%d",&n,&m);
for(int i=0;i<2*n;i++) scanf("%d",&a[i]);
for(int i=0;i<2*m;i++) scanf("%d",&b[i]);
for(int i=0;i<2*n;i++)//a测试者
{
for(int j=0;j<2*m;j++)
if(a[i]==b[j] && a[i^1]!=b[j^1]) pa[i]=1;//需判断两个数对不完全相同
if(pa[i]&pa[i^1]) qwq=1;
if(pa[i] && ans && ans!=a[i]) qaq=1;
else if(pa[i]) ans=a[i];
}
for(int i=0;i<2*m;i++)//b测试者
{
for(int j=0;j<2*n;j++)
if(b[i]==a[j] && b[i^1]!=a[j^1]) pb[i]=1;
if(pb[i]&pb[i^1]) qwq=1;
//因为输出0或结果的情况a、b的答案是一样的,不用再次更新
}
if(qwq==1) printf("-1");
else if(qaq==1) printf("0");
else printf("%d",ans);
return 0;
}