用Python解“智力游戏”

2024-02-29 21:30
文章标签 python 游戏 智力

本文主要是介绍用Python解“智力游戏”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,欢迎来到Crossin的编程教室!我是Crossin

之前国庆假期在家闲来无事,找了一本“思维训练手册”(其实就是一些智力题、推理题,甚至“脑筋急转弯”),跟家人一起玩智力游戏。这些题是不是真的可以训练人的思维我不知道,但是看了几题我忍不住要吐槽:这真的不是从“青少年信息学奥林匹克”题库里找出来的题吗?!

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfNDQ=,g_se,x_0,y_0,t_100

里面有不少题,让人做是有的烧(wu)脑(liao),但如果改成编程题,那倒有点意思了。

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfMTU=,g_se,x_0,y_0,t_100

于是,原本拿着纸笔做题的场景,就立马被我改成了拿出电脑敲代码的画风。

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfNDM=,g_se,x_0,y_0,t_100

我从里面挑了3题,你们感受一下。

如果你像我一样喜(xian)欢(de)挑(wu)战(liao),也可以来试试,不管用不用编程。

答案在文末,另外也附了我的代码解法,欢迎取用。

1.

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfNjI=,g_se,x_0,y_0,t_100

(答案见文末)

思路提示:

用程序解这类“智力题”有个屡试不爽的方法,就是“枚举法”,或者叫做“暴力解法”。就是对于存在有限种可能选择的情况下,让程序把每一种情况都试一遍,找出符合条件的解。

这题就可以暴力去解。

当然,暴力最好也要有头脑的暴力。比如这里,5个3位数,从中去掉9个数,听上去有点烦。但反过来想,其实不就是从里面挑6个数字嘛!

100、10、1、300、……、90、9,这15个数里面取6个,使得它们的和是1111,这我已经不能再提示了吧!

对了,再说一句:Python里有个取排列/组合的库,叫做:itertools。谁用谁知道

2.

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfNjI=,g_se,x_0,y_0,t_100

为了方便讨论,我给这些圆圈加上编号:

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfNjI=,g_se,x_0,y_0,t_100

(答案见文末)

思路提示:

这题,比上一题复杂,因为它的不是一个规则的“形状”。但它的可能性依然是有限,且不是很多。

9个数放进9个格子里,最多也就是9!=362880种情况,这对于计算机来说是个小case。关键在于你如何判断某种情况是符合要求的。

如果你看过“数据结构”有关的书,应该会想到这个结构就是一个“”。我们可以将每个格子定义为一个类,也就是一个节点,每个节点有一个值,还有一个列表,记录它相连其他节点。

判断一个节点是否符合要求,就把它相连节点的值加起来,看看是否与它自己的值所对应的和相等。如果每个节点都符合,那就是我们要的答案。

不过呢,这题还有另一种思路,就是用“递归”去解:

1. 判断 n 个值和 n 个格子是否有解

2. 将一个“不违反条件”的值放入一个格子,然后判断剩下 n-1 个值和 n-1 个格子是否有解,以此类推

3. 如果格子全部放完,即得到答案

4. 如果剩下的值里找不到“不违反条件”的值,则退回上一步,选择下一个值继续

不过就这题来说,递归的条件设定有点复杂,我就不展开细说了,代码里我也给了递归的版本。

特别说明:枚举版本最后遍历了59674种情况,在我的电脑上花了0.18秒“撞”到了答案;而递归版本判断了5320种情况,花了0.015秒。

3.

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfNjI=,g_se,x_0,y_0,t_100

(答案见文末)

思路提示:

这题就不再适合暴力去解了,因为52个值分到4个盒子里,一共是有4的52次方,也就是20282409603651670423947251286016种情况……

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfMjE=,g_se,x_0,y_0,t_100

但是仔细想一下,这题也不必暴力。我们只需要把52个值从小到大依次往盒子里放就行。只是放的时候需要判断一下,哪个盒子是“不”能放的,即其中盒子里已有两个数的和等于这个值。如果存在,那么就去下一个盒子,此处不留爷,自有留爷处!(处处不留爷,那一定是题目出错了!)

OK,先就来这3题试试看吧!

讲真,这种题虽然没啥实际意义,但若真要你用代码写出来,也不是那么容易的,很考验你对程序逻辑和数据结构的理解。所以,很多IT公司在招聘开发岗位时也会出一些类似的题,既是考察你分析问题的能力,也能看出你写代码的水平。讲不定哪天你就在面试时碰到我发过的题目呢。(事实上,这种事已经发生过几次了,甚至还有面试官就直接拿我的题目去面人的)

watermark,image_bG9nby9jc2RuXzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLGhfNDE=,g_se,x_0,y_0,t_100

欢迎在留言区分享你的解答!如果大家对此类题目感兴趣,之后我再多弄一些来。

本文题目来源自《思维高手:全世界聪明人都在做的200个思维游戏》

相关代码:

crossin/snippet

智力题

答案:

1.

111

x3x

x7x

9xx

(此题共有5个解,参见代码输出)

2.

按图上圆圈标记顺序:

2, 5, 8, 9, 3, 4, 6, 7, 1

3.

[1, 2, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52],

[3, 5, 6, 12, 14, 21, 23, 30, 32, 39, 41, 48, 50],

[8, 9, 11, 15, 18, 35, 36, 38, 42],

[17, 20, 24, 26, 27, 29, 33, 45]

(此题也不是唯一解,比如把48放进盒子4也是可以的)

----

获取更多教程和案例,

欢迎搜索及关注:Crossin的编程教室

这里还有更多精彩。一起学,走得远!

这篇关于用Python解“智力游戏”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_40190310/article/details/112845216
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/760139

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四