- 描述
- 赛利有12枚银币。其中有11枚真币和1枚假币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利称三次就能找出假币并且确定假币是轻是重。例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。经过精心安排每次的称量,赛利保证在称三次后确定假币。
- 输入
- 第一行有一个数字n,表示有n组测试用例。
对于每组测试用例:
输入有三行,每行表示一次称量的结果。赛利事先将银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币
天平右边放置的硬币 平衡状态。其中平衡状态用``up‘‘, ``down‘‘, 或 ``even‘‘表示,
分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。 - 输出
- 输出哪一个标号的银币是假币,并说明它比真币轻还是重(heavy or light)。
- 样例输入
-
1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even
- 样例输出
-
K is the counterfeit coin and it is light.
1 /* 2 数学模型中包含多个变量的例子 3 问题 给出三组称量方式及其结果,判断出十二个金币中哪个是假币,并且说明是比真币重还是比真币轻 4 解题思路 :首先想到的是共12个金币,且每个金币有两种情况,所以采用枚举法,变量分别是每个金币的编号x和轻重2 5 在所有可能的24种猜测中,枚举每个金币及其轻重,当满足所有条件时为假设成立*/ 6 #include<stdio.h> 7 #include<string.h> 8 int judge(int x,int w); 9 char left[3][10],right[3][10],result[3][10]; 10 int main() 11 { 12 int t; 13 scanf("%d",&t); 14 int i; 15 while(t--) 16 { 17 for(i=0;i<=2;i++) 18 scanf("%s%s%s",left[i],right[i],result[i]); 19 int x,w; 20 for(x=0;x<=11;x++) 21 { 22 if(judge(x,0)) 23 { 24 printf("%c is the counterfeit coin and it is light.\n",x+‘A‘); 25 break; 26 } 27 if(judge(x,1)) 28 { 29 printf("%c is the counterfeit coin and it is heavy.\n",x+‘A‘); 30 break; 31 } 32 } 33 } 34 return 0; 35 } 36 int judge(int x,int w) 37 { 38 int i; 39 for(i=0;i<=2;i++) 40 { 41 if(!strcmp(result[i],"even"))//strcmp函数的使用,相同时返回0,前者的字典序大于后者时返回1,反之返回0 42 { 43 if(strchr(left[i],x+‘A‘) != NULL || strchr(right[i],x+‘A‘) != NULL) 44 return 0; 45 } 46 if(!strcmp(result[i],"up")) 47 { 48 if(w==0 && strchr(left[i],x+‘A‘) != NULL) 49 return 0; 50 if(w==1 && strchr(right[i],x+‘A‘) != NULL) 51 return 0; 52 } 53 if(!strcmp(result[i],"down")) 54 { 55 if(w==0 && strchr(right[i],x+‘A‘) != NULL) 56 return 0; 57 if(w==1 && strchr(left[i],x+‘A‘) != NULL) 58 return 0; 59 } 60 } 61 return 1; 62 } 63 /*错误分析 64 注意strcmp函数的使用 65 strchr的使用,找到返回第一次出现时的指针,找不到返回BULL*/
原文地址:https://www.cnblogs.com/wenzhixin/p/8428673.html
时间: 2024-10-11 12:11:11