100个python算法超详细讲解:旅客国籍

2024-01-14 16:30

本文主要是介绍100个python算法超详细讲解:旅客国籍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【100个python算法超详细讲解】@谷哥技术

1.问题描述
在一个旅馆中住着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各是哪国人。
2.问题分析
根据问题描述中给定的条件可进行如下分析:
·由“A和美国人是医生”可知A不是美国人。
·由“E和俄罗斯人是教师”可知E不是俄罗斯人。
·由“C和德国人是技师”可知C不是德国人。
·又因为A的职业是医生,与俄罗斯人和德国人的职业不同,故A不是俄
罗斯人也不是德国人。E的职业是教师,与美国人和德国人的职业不同,故E
不是美国人也不是德国人。C的职业是技师,与美国人和俄罗斯人不同,故C
不是美国人也不是俄罗斯人。
·由“B和F曾经当过兵,而德国人从未参过军”可知,B和F不是德国人。
·由“法国人比A年龄大,意大利人比C年龄大”可知,A不是法国人,C不
是意大利人。
·由“B同美国人下周要去西安旅行,而C同法国人下周要去杭州度假”可
知,B不是美国人,也不是法国人,C不是法国人。
用条件矩阵将上面的分析结果表示出来:

根据上面的条件矩阵使用消去法,即可得到问题的结果。
3.算法设计
下面给出从条件矩阵初始化到完成消去得到结果的整个过程中条件矩阵
每一步的变化,矩阵中加粗的元素表示在该步骤中该元素发生了变化。具体
变化过程如下:
1)初始化条件矩阵。

 

 2)将问题分析中得出的结果在条件矩阵中表示出来。

 条件矩阵中为0的项表示不是该国的人,同时将条件矩阵中每一列的0号
元素都置为1,用来表示该列尚未进行处理。
3)第4列只有一个元素为0,执行消去操作。
执行消去操作时从只有一个元素为非0的列开始消去。

 将条件矩阵中非零元素所在行的其他元素都置为0,同时置a[0][4]为0,
表示条件矩阵中第4列已处理完毕。
4)第1列只有一个元素为0,执行消去操作。
显然,当条件矩阵位于状态(c)时,第1列中只有一个元素非0,可执
行消去操作。

5)第3列只有一个元素为0,执行消去操作。
显然,当条件矩阵位于状态(d)时,第3列中只有一个元素非0,可执
行消去操作。

 

6)第6列只有一个元素为0,执行消去操作。
显然,当条件矩阵位于状态(e)时,第6列中只有一个元素非0,可执
行消去操作。

 

7)第5列只有一个元素为0,执行消去操作。
显然,当条件矩阵位于状态(f)时,第5列中只有一个元素非0,可执行
消去操作。

 

8)第2列只有一个元素为0,执行消去操作。
当条件矩阵位于状态(g)时,只有第2列还未被处理,经观察发现,该
非零元素所在行(第3行)的所有其他元素都已经为0了,但在我们编程实现
时,程序还是会对该行的每个元素都检查一遍。 

执行消去操作后的矩阵状态为状态(h)所示。该矩阵中除了第0列以外
每列都只有一个元素非0,由此就可推断出A、B、C、D、E、F到底是哪国
人。
4.确定程序框架
总结上述矩阵状态的变化过程,可得出程序执行的简要流程,如图6.9所
示。 

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: ?TF-8 -*-
#author:liuhefei
#desc: 旅客国籍
country = [" ", "美国", "英国", "法国", "德国", "意大利", "俄罗斯"] #国名
def Nationality():
#初始化条件矩阵
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(country[a[i][j]], '。')
break
if __name__ == '__main__':
Nationality()

 6.运行结果
在PyCharm下运行程序,结果如图6.10所示。根据运行结果可知:A是意
大利人,B是俄罗斯人,C是英国人,D是德国人,E是法国人,F是美国人。

 7.拓展训练
根据题意生成条件矩阵,再使用消去法进行推理判断是一种常用的方
法,该方法对于解决较为复杂的逻辑问题是十分有效的,希望读者能够掌
握。

这篇关于100个python算法超详细讲解:旅客国籍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/605793

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的