黑马程序员技术交流社区

标题: 考逻辑的 思维逻辑很重要哦~注释以及算法分析已加 [打印本页]

作者: 小歪    时间: 2014-3-27 12:49
标题: 考逻辑的 思维逻辑很重要哦~注释以及算法分析已加
本帖最后由 小歪 于 2014-3-27 17:01 编辑

区分旅客国籍

在一个旅馆中住着六个不同国籍的人,他们分别来自美国、德国、英国、法国、俄罗斯和意大利。他们的名字叫A、B、C、D、E和F。名字的顺序与上面的国籍不一定是相互对应的。
现在已知:
①A和美国人是医生。
②E和俄罗斯人是教师。
③C和德国人是技师。
④B和F曾经当过兵,而德国人从未参过军。
⑤法国人比A年龄大;意大利人比C年龄大。
⑥B同美国人下周要去西安旅行,而C同法国人下周要去杭州度假。
试问由上述已知条件,A、B、C、D、E和F各是哪国人?
问题分析:
首先进行题目分析,尽可能利用已知条件,确定谁不是哪国人。

由:①②③可知:A不是美国人,E不是俄罗斯人,C不是德国人。另外因为A与俄、德国人的职业不同,E与美、德人的职业不同,C与美、俄人的职业不同,故A不是俄罗斯人或德国人,E不是美国人或德国人,C不是美国人或俄罗斯人。
由④和⑤可知B和F不是德国人,A不是法国人,C不是意大利人。
由⑥可知B不是美国人,也不是法国人(因B与法国人下周的旅行地点不同);C不是法国人。


根据分析我列出下面这个表:
条件:  美(医) 英  法  德(技)  意  俄(教)


a[0][]      0          1   0      0             1  0       A   
a[1][]      0          1   0      0             1  1       B  
a[2][]      0          1   0      0             0  0       C   
a[3][]      1          1   1      1             1  1       D   
a[4][]      0          1   1      0             1  0       E   
a[5][]      1          1   1      0             1  1       F   




每一行代表一个人,即:a[0][]代表A ,  a[1][]代表B...以此类推
而列代表对应的可能性  0为绝对不可能,1暂时标为有可能

我写的代码:
  1. <font color="#000000">class Num56{
  2.         public static void main(String args[])
  3.         {
  4.                 int a[][]=new int[6][6];
  5.                 int i,j,sum=0,n,cishu=6;
  6.                
  7.                 for(i=0;i<6;i++)
  8.                  for(j=0;j<6;j++)  
  9.                  {
  10.                          a[i][j]=1;         //初始化数组中的元素,暂时全标为1(有可能)
  11.                  }
  12.                  
  13.           a[0][0]=a[0][2]=a[0][3]=a[0][5]=0;
  14.           a[1][0]=a[1][2]=a[1][3]=0;
  15.           a[2][0]=a[2][2]=a[2][3]=a[2][4]=a[2][5]=0;
  16.           a[4][0]=a[4][3]=a[4][5]=0;
  17.           a[5][3]=0;        //将我们分析到的已经绝对不可能的情况初始化
  18.          
  19.           while(cishu!=0)       //控制循环次数,6个人共6次
  20.           {  
  21.                  for(i=0;i<6;i++)
  22.                   {
  23.                           for(j=0;j<6;j++)   sum+=a[i][j];     //将每一行的元素值累加
  24.                           if(sum==1)       //如果当前此行累加和为1,则此行就可通过查表对应其国家
  25.                           {
  26.                                   n=count(a[i]);      //调用count()方法获得元素值为1的 元素下标
  27.                                  
  28.                                   guojia(i,n);        //调用guojia()方法,传入行号和下标,查表对应其身份A、B...以及其国家
  29.                                   
  30.                                   a[0][n]=a[1][n]=a[2][n]=a[3][n]=a[4][n]=a[5][n]=0;   //诺此国家已确定,则对应的列元素值肯定都为0       
  31.                           }
  32.                           sum=0;    //初始化累加器
  33.                   }
  34.                   cishu--;
  35.           }
  36.         }
  37.        
  38.         public static int count(int b[])    //此方法用于获得元素值为1的下标
  39.         {
  40.                 int n,i;
  41.                 for(i=0;i<6;i++)
  42.                 if(b[i]==1)
  43.                 {
  44.                         n=i;
  45.                 return n;
  46.                 }
  47.                 return 0;
  48.         }
  49.        
  50.         public static void guojia(int a,int b)       //此方法通过传入的 行号以及下标,对应其在表中的身份和国籍
  51.         {
  52.                 switch(a)
  53.                 {   case 0: System.out.print("A是***"); break;
  54.                     case 1: System.out.print("B是***"); break;
  55.                         case 2: System.out.print("C是***"); break;
  56.                         case 3: System.out.print("D是***"); break;
  57.                         case 4: System.out.print("E是***"); break;
  58.                         case 5: System.out.print("F是***"); break;
  59.                 }
  60.                
  61.                 switch(b)
  62.                 {   case 0: System.out.print("美国人\n"); break;
  63.                     case 1: System.out.print("英国人\n"); break;
  64.                         case 2: System.out.print("法国人\n"); break;
  65.                         case 3: System.out.print("德国人\n"); break;
  66.                         case 4: System.out.print("意大利人\n"); break;
  67.                         case 5: System.out.print("俄罗斯人\n"); break;
  68.                 }
  69.         }

  70. }</font>
复制代码





运行结果 :







作者: syusikoku    时间: 2014-3-27 16:45
有点技术会计师哟。把注释也给加上来啥。让我们也学习学习呀。
作者: 小歪    时间: 2014-3-27 16:49
已经 加上了   你们 看看
作者: 小歪    时间: 2014-3-27 16:50
晕 直接在帖子上 加的注释 除了点小问题  我在修改下
作者: 小歪    时间: 2014-3-27 17:03
好了  可以看了:dizzy:
作者: 李庆忠    时间: 2014-3-28 11:43
楼主好人!顶一个

作者: 霍振鹏    时间: 2014-3-28 23:49
厉害。。。。。抽空得多看看算法了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2