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*/