https://vjudge.net/problem/POJ-1013
给定你A-L个硬币,称三次,给定大小关系。
up是说左边的比右边沉,down是右边的比左边的沉。
even是重量一样的意思。
三次称量一定能知道谁是假的硬币,请输出他并且判定他是重的还是轻的。
直接暴力,26种情况。
模拟过程。wa了两次,因为我还以为范围是A-K,其实是A-l。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
struct Node
{ string a;
string b;
string w;
int a_v;
int b_v;
}node[4];
int main()
{ int t;
map<char,int>v;
cin>>t;
while(t--){
for(int i=0;i<3;i++){
cin>>node[i].a;
cin>>node[i].b;
cin>>node[i].w;
}
int bj=0;
int kind=0;
bool flag=false;
for(int i=0;i<=11&&!flag;i++){
for(int j=0;j<=1&&!flag;j++){
for(int c=0;c<=11;c++)
v[c+'A']=2;
if(j==0)
v[i+'A']=3;
if(j==1)
v[i+'A']=1;
bool kk=true;
for(int x=0;x<3&&kk;x++){
node[x].a_v=0;
node[x].b_v=0;
for(int len=0;len<node[x].a.length();len++)
node[x].a_v+=v[node[x].a[len]];
for(int len=0;len<node[x].b.length();len++)
node[x].b_v+=v[node[x].b[len]];
if(node[x].b_v<node[x].a_v&&(node[x].w=="down"||node[x].w=="even"))
kk=false;
if(node[x].b_v==node[x].a_v&&(node[x].w=="up"||node[x].w=="down"))
kk=false;
if(node[x].b_v>node[x].a_v&&(node[x].w=="up"||node[x].w=="even"))
kk=false;
}
if(kk)
{ bj=j;kind=i;
flag=true;}
}
}
if(bj==1)
printf("%c is the counterfeit coin and it is light.\n",kind+'A');
else if(bj==0)
printf("%c is the counterfeit coin and it is heavy.\n",kind+'A');
}
return 0;
}