在一个旅馆中住着6个不同国籍的人,他们分别来自美国、德国、英国、法国、俄罗斯和意大利。他们的名字分别叫A、B、C、D、E和F,要说明的是名字的顺序与前面提到的国籍不一定是相互对应的。
现在已知:
1)A和美国人是医生。
2)E和俄罗斯人是教师。
3)C和德国人是技师。
4)B和F曾经当过兵,而德国人从未参过军。
5)法国人比A年龄大,意大利人比C年龄大。
6)B同美国人下周要去西安旅行,而C同法国人下周要去杭州度假。
那么问题来了,求出A、B、C、D、E和F各是哪国人。
下面直接上代码:
########################
guo = [" ", "美国", "英国", "法国", "德国", "意大利", "俄罗斯"]
def guojia():
#初始化条件矩阵
a = []
for i in range(7):
b = []
for j in range(7):
b.append(j)
a.append(b)
for i in range(1, 7): #条件矩阵每一列的第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
x = 0
y = 0
while a[0][1] + a[0][2] + a[0][3] + a[0][4] + a[0][5] + a[0][6] > 0:
#当所有6列均处理完毕后退出循环
for i in range(1, 7): #i为列坐标
if a[0][i] != 0: #若该列尚未处理,则进行处理
e = 0
for j in range(1, 7): #j变量保存行坐标,e变量是该列中非0元素的计数器
if a[j][i] != 0:
#统计每列中的非0元素个数
x = j #x变量保存行坐标
y = i #y变量保存列坐标
e += 1
if e == 1: #若该列只有一个元素为非零,则进行消去操作
for t in range(1, 7):
if t != i:
a[x][t] = 0 #将非零元素所在行的其他元素置0
a[0][y] = 0 #设置该列已处理完毕的标记
print("矩阵最终状态为:")
for i in range(7):
print(a[i])
print("推断结果为:")
for i in range(1, 7):
print(chr(ord('A') - 1 + i), '来自: ', end='')
for j in range(1, 7):
if a[i][j] != 0:
print(guo[a[i][j]])
break
if __name__ == '__main__':
guojia()
########################
执行结果如下:
矩阵最终状态为:
[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 来自: 美国
________________END______________
网友评论