本帖最后由 小歪 于 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暂时标为有可能
我写的代码:- <font color="#000000">class Num56{
- public static void main(String args[])
- {
- int a[][]=new int[6][6];
- int i,j,sum=0,n,cishu=6;
-
- for(i=0;i<6;i++)
- for(j=0;j<6;j++)
- {
- a[i][j]=1; //初始化数组中的元素,暂时全标为1(有可能)
- }
-
- a[0][0]=a[0][2]=a[0][3]=a[0][5]=0;
- a[1][0]=a[1][2]=a[1][3]=0;
- a[2][0]=a[2][2]=a[2][3]=a[2][4]=a[2][5]=0;
- a[4][0]=a[4][3]=a[4][5]=0;
- a[5][3]=0; //将我们分析到的已经绝对不可能的情况初始化
-
- while(cishu!=0) //控制循环次数,6个人共6次
- {
- for(i=0;i<6;i++)
- {
- for(j=0;j<6;j++) sum+=a[i][j]; //将每一行的元素值累加
- if(sum==1) //如果当前此行累加和为1,则此行就可通过查表对应其国家
- {
- n=count(a[i]); //调用count()方法获得元素值为1的 元素下标
-
- guojia(i,n); //调用guojia()方法,传入行号和下标,查表对应其身份A、B...以及其国家
-
- a[0][n]=a[1][n]=a[2][n]=a[3][n]=a[4][n]=a[5][n]=0; //诺此国家已确定,则对应的列元素值肯定都为0
- }
- sum=0; //初始化累加器
- }
- cishu--;
- }
- }
-
- public static int count(int b[]) //此方法用于获得元素值为1的下标
- {
- int n,i;
- for(i=0;i<6;i++)
- if(b[i]==1)
- {
- n=i;
- return n;
- }
- return 0;
- }
-
- public static void guojia(int a,int b) //此方法通过传入的 行号以及下标,对应其在表中的身份和国籍
- {
- switch(a)
- { case 0: System.out.print("A是***"); break;
- case 1: System.out.print("B是***"); break;
- case 2: System.out.print("C是***"); break;
- case 3: System.out.print("D是***"); break;
- case 4: System.out.print("E是***"); break;
- case 5: System.out.print("F是***"); break;
- }
-
- switch(b)
- { case 0: System.out.print("美国人\n"); break;
- case 1: System.out.print("英国人\n"); break;
- case 2: System.out.print("法国人\n"); break;
- case 3: System.out.print("德国人\n"); break;
- case 4: System.out.print("意大利人\n"); break;
- case 5: System.out.print("俄罗斯人\n"); break;
- }
- }
- }</font>
复制代码
运行结果 :
|