-
Notifications
You must be signed in to change notification settings - Fork 378
/
旅客国籍问题.c
94 lines (86 loc) · 3.48 KB
/
旅客国籍问题.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
在一个旅馆中住着6个不同国籍的人,他们分别来自美国、德国、英国、法国、俄罗斯和意大利这几个国家。
他们的名字分别叫A、B、C、D、E和F,要说明的是名字的顺序与前面提到的国籍不一定是相互对应的。现在已知:
A和美国人是医生。
E和俄罗斯人是教师。
C和德国人是技师。
B和F曾经当过兵,而德国人从未参过军。
法国人比A年龄大,意大利人比C年龄大。
B同美国人下周要去西安旅行,而C同法国人下周要去杭州度假。
现要求根据上述已知条件,编程求出A、B、C、D、E和F各是哪国人。
*/
#include <stdio.h>
int main()
{
char *m[7]={" ","美国","英国","法国","德国","意大利","俄罗斯"}; /*国名*/
int a[7][7], i, j, t, e, x, y;
for(i=0; i<7; i++) /*初始化条件矩阵*/
for(j=0; j<7; j++) /*行为人,列为国家,元素的值表示某人是该国人*/
a[i][j]=j;
for(i=1; i<7; i++) /*条件矩阵每一列的第0号元素作为该列数据处理的标记*/
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][4]=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)
{ /*当所有六列均处理完毕后退出循环*/
for(i=1; i<7; i++) /*i:列坐标*/
if( a[0][i] ) /*若该列尚未处理,则进行处理*/
{
for(e=0,j=1; j<7; j++) /*j:行坐标 e:该列中非0元素计数器*/
if( a[j][i] )
{ /*统计每列中的非0元素个数*/
x=j; /*x变量保存行坐标*/
y=i; /*y变量保存列坐标*/
e++;
}
if( e==1 ) /*若该列只有一个元素为非零,则进行消去操作*/
{
for(t=1; t<7; t++)
if( t!=i )
a[x][t]=0; /*将非零元素所在的行的其它元素置0*/
a[0][y]=0; /*设置该列已处理完毕的标记*/
}
}
}
printf("矩阵最终状态为:\n");
for(i=0; i<7; i++) /*初始化条件矩阵*/
{
for(j=0; j<7; j++) /*行为人,列为国家,元素的值表示某人是该国人*/
printf("%d ", a[i][j]);
printf("\n");
}
printf("\n");
printf("推断结果为:\n");
for(i=1; i<7; i++) /*输出推理结果*/
{
printf("%c来自",'A'-1+i);
for(j=1; j<7; j++)
if( a[i][j] != 0 )
{
printf("%s。\n", m[a[i][j]]);
break;
}
}
return 0;
}
//运行结果:
/**
矩阵最终状态为:
0 0 0 0 0 0 0
0 0 0 0 0 5 0
0 0 0 0 0 0 6
0 0 2 0 0 0 0
0 0 0 0 4 0 0
0 0 0 3 0 0 0
0 1 0 0 0 0 0
推断结果为:
A来自意大利。
B来自俄罗斯。
C来自英国。
D来自德国。
E来自法国。
F来自美国。
*/