zoukankan      html  css  js  c++  java
  • 2692 假币问题(枚举——数学模型中包含多个变量)

    描述
    赛利有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.
    ",x+'A');
    25                 break;    
    26             } 
    27             if(judge(x,1))
    28             {
    29                 printf("%c is the counterfeit coin and it is heavy.
    ",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*/
  • 相关阅读:
    张旭结对编程作业
    团队第一次作业(软工C#造梦厂)
    张旭第二次作业
    跨域问题
    .Net Core3.1使用AspectCore
    .Net中HttpClient之SendAsync方法
    两个具有相同属性的类赋值
    工具类--HttpUtils
    工具类--CacheHelper
    工具类--JsonHelper
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8428673.html
Copyright © 2011-2022 走看看