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

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地