有点小麻烦的模拟。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int vis['Z'];
int istrue['Z'];
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
int min=0x3f3f3f3f;
int max=-0x3f3f3f3f;
int eps=max; //计算与特殊值的差
string a[3],b[3],c[3];
memset(vis,0,sizeof(vis));
memset(istrue,0,sizeof(istrue));
cin>>a[0]>>b[0]>>c[0];
cin>>a[1]>>b[1]>>c[1];
cin>>a[2]>>b[2]>>c[2];
for(i=0;a[0][i];i++)
vis[a[0][i]]=vis[b[0][i]]=1000;
for(i=0;a[1][i];i++)
vis[a[1][i]]=vis[b[1][i]]=1000;
for(i=0;a[2][i];i++)
vis[a[2][i]]=vis[b[2][i]]=1000; //给出现过的字符标上特殊值。
for(i=0;i<3;i++)
{
if(c[i]=="even")
{
for(j=0;a[i][j];j++)
{
istrue[a[i][j]]=1; //istrue数组记录绝对正确的硬币
istrue[b[i][j]]=1;
}
}
if(c[i]=="up")
{
for(j=0;a[i][j];j++)
{
vis[ a[i][j] ]++;
vis[ b[i][j] ]--;
}
}
if(c[i]=="down")
{
for(j=0;a[i][j];j++)
{
vis[ a[i][j] ]--;
vis[ b[i][j] ]++;
}
}
}
int ok,k;
for(i='A';i<='L';i++)
{
ok=1;
if(vis[i]==0) continue;
if(vis[i]<min) min=vis[i];
if(vis[i]>max) max=vis[i];
if(istrue[i]) continue;
for(j='A';j<='L';j++) //第一次判断,假币在++,--,计算后很可能是一个只出现一次的值
{
if(i==j||vis[j]==0||istrue[j]) continue;
if(vis[i]==vis[j])
{ok=0;break;}
}
if(ok)
{
if(abs(vis[i]-1000)>eps) {eps=abs(vis[i]-1000);k=i;} //再一次判断,如果相差越大,说明越是假币
}
}
if(vis[k]==min) printf("%c is the counterfeit coin and it is light.\n",k);
else printf("%c is the counterfeit coin and it is heavy.\n",k);
}
return 0;
}
/*
送数据
sample input
12
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
AGHL BDEC even
JKI ADE up
J K even
ABCDEF GHIJKL up
ABC DEF even
I J down
ABCDEF GHIJKL up
ABHLEF GDIJKC down
CD HA even
A B up
B A down
A C even
A B up
B C even
DEFG HIJL even
ABC DEJ down
ACH IEF down
AHK IDJ down
ABCD EFGH even
AB IJ even
A L down
EFA BGH down
EFC GHD even
BA EF down
A B up
A C up
L K even
ACEGIK BDFHJL up
ACEGIL BDFHJK down
ACEGLK BDFHJI down
ACEGIK BDFHJL up
ACEGIL BDFHJK down
ACEGLK BDFHJI up
sample output
K is the counterfeit coin and it is light.
I is the counterfeit coin and it is heavy.
I is the counterfeit coin and it is light.
L is the counterfeit coin and it is light.
B is the counterfeit coin and it is light.
A is the counterfeit coin and it is heavy.
A is the counterfeit coin and it is light.
L is the counterfeit coin and it is heavy.
A is the counterfeit coin and it is light.
A is the counterfeit coin and it is heavy.
L is the counterfeit coin and it is light.
K is the counterfeit coin and it is heavy.
*/