POJ1013
大致题意:
有一打(12枚)硬币,其中有且仅有1枚假币,11枚真币
用A~L作为各个硬币的代号
假币可能比真币略轻,也可能略重
现在利用天枰,根据Input输入的3次称量,找出假币,并输出假币是轻还是重。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int Abs(int a)
{
return a>0?a:(-a);
}
int vis[15];
int main()
{
int i,j,T,k;int ans;
char str1[10],str2[10],str3[10];
scanf("%d",&T);
getchar();
while(T--)
{
ans=0;
for(i=1;i<=12;i++)
{
vis[i]=10;
}
for(k=1;k<=3;k++)
{
//getchar();
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
memset(str3,0,sizeof(str3));
scanf("%s %s %s",str1,str2,str3);
if(strcmp(str3,"even")==0)
{
for(i=0;str1[i]!='\0';i++)
vis[str1[i]-'A'+1]=0;
for(i=0;str2[i]!='\0';i++)
vis[str2[i]-'A'+1]=0;
}
else if(strcmp(str3,"up")==0)
{
for(i=0;str1[i]!='\0';i++)
if(vis[str1[i]-'A'+1]!=0)
vis[str1[i]-'A'+1]++;//左边重假币
for(i=0;str2[i]!='\0';i++)
if(vis[str2[i]-'A'+1]!=0)
vis[str2[i]-'A'+1]--;//右边轻假币
}
else
{
for(i=0;str1[i]!='\0';i++)
if(vis[str1[i]-'A'+1]!=0)
vis[str1[i]-'A'+1]--;//左边轻假币
for(i=0;str2[i]!='\0';i++)
if(vis[str2[i]-'A'+1]!=0)
vis[str2[i]-'A'+1]++;//右边重假币
}
ans=0;
for(i=1;i<=12;i++)
{
if(Abs(vis[i]-10)>Abs(ans)&&vis[i]!=0)
{
ans=vis[i]-10;
j=i;
// printf("%d\n",j);
}
}
}
if(ans>0)
printf("%c is the counterfeit coin and it is heavy.\n",j+64);
else
printf("%c is the counterfeit coin and it is light.\n",j+64);
}
system("pause");
return 0;
}
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

浙公网安备 33010602011771号