黑马程序员技术交流社区
标题:
考逻辑的 思维逻辑很重要哦~注释以及算法分析已加
[打印本页]
作者:
小歪
时间:
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暂时标为有可能
我写的代码:
<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>
复制代码
运行结果 :
QQ截图20140327124933.png
(43.57 KB, 下载次数: 27)
下载附件
2014-3-27 12:49 上传
作者:
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