C趣味程序百例(17)区分旅客国籍
56.区分乘客的国籍
一家酒店住着6个不同国籍的人。他们来自美国、德国、英国、法国、俄罗斯和意大利。他们的名字分别是A、B、C、D、E、f,名字的顺序不一定对应以上国籍。现在大家都知道:
1)一个美国人是医生。E和俄罗斯人是技术人员。
3)C而德国人是技术员。
4)B和F曾经是军人,而德国人从来没有参过军。
5)法国人比A还要老;意大利人的年龄比中国人大。美国人下周将去Xi旅游,而中国人和法国人下周将在杭州度假。
从上面已知的条件来看,A、B、C、D、E、F是哪些国籍?
*问题分析及算法设计
首先分析题目,尽可能利用已知条件,判断谁不是哪个国家的人。
从:1) 2) 3)可以看出,A不是美国人,E不是俄罗斯人,C不是德国人。另外,因为A不同于德国职业,E不同于美国和德国职业,C不同于美国和俄罗斯职业,所以A不是俄罗斯人也不是德国人,E不是美国人也不是德国人,C也不是美国人也不是俄罗斯人。
从4)和5)可以看出,B和F不是德国人,A不是法国人,C不是意大利人。
从6)中可以看出,B既不是美国人,也不是法国人(因为B在接下来的一周里与法国人不同);c不是法语。
综合以上结果可以得到以下条件矩阵:
。美国(医生)、英国、法国、德国(技师)、意大利、俄罗斯(教师)
A(医生)X.X.X.
B X.X...
C(
【/br/】根据此表,用消元法解题,很容易得到问题的答案。
将条件矩阵输入计算机,用程序实现消元算法是很容易的。
*计划和计划说明
#包括
char * m [7] = { " "、"美国"、"英国"、"法国"、"德国"、"意大利"、"欧洲" };/*国家名称*/
void main()
{
int a[7][7],I,J,T,E,X,Y;
for(I = 0;I for(j = 0;j a[I][j]= j;
for(I = 1;I a[0][I]= 1;/*将该列标记为未处理*/
A[1][1]= A[2][1]= A[3][1]= A[5][1]= 0;/*在条件矩阵中输入各种条件*/
A[1][3]= A[2][3]= A[3][3]= 0;/*0表示不是这个国家的人*/
A[1]= A[2][4]= A[3][4]= A[5][4]= A[6][4]= 0;
a[3][5]= 0;
a[1][6]= a[3][6]= a[5][6]= 0;
while(a[0][1]+a[0][2]+a[0][3]+a[0][4]+a[0][5]+a[0][6]> 0)
{ I(a[0][I])/*如果该列未被处理,则将被处理*/
{
for(e=0,j = 1;j if(a[j][I]){ x = j;y = I;e++;}
[4]
位律师回复
0条评论