| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 程序员的算法趣题Q69: 蓝白歌会(1) -> 正文阅读 |
|
[数据结构与算法]程序员的算法趣题Q69: 蓝白歌会(1) |
作者:4.%20%E5%90%8E%E8%AE%B0 |
目录 1. 问题描述问题:当有4*6=24个人,以12人为一组分为两组时,求所需移动次数最多的起始状态有多少种? 2. 解题分析2.1 基本思路????????由于终止状态是确定的(4个),所以适合于逆向搜索(本系列前面出现过不少逆向思维解决的问题例)。 ????????位置交换动作是可逆的,从4个确定性的终止状态开始,通过合理的位置交换操作(确保距离最小化)寻找距离4个确定性的终止状态最远的初始状态。这个显然是图搜索中最大距离问题,适合于用广度优先搜索算法。 ????????另外,由于本题要求不仅找出最大距离,还要求找出满足这一条件的初始状态的个数,所以相当于要找出再广度优先搜索中出现在最远一层的所有状态的个数。 2.2 算法流程????????基于广度优先搜索的算法流程如下所示: ?2.3 实现要点????????当前人员状态用二维数组(本题解用numpy数组)表示,为了方便判断,与棋盘问题类似采用了外加围栏的方式。 ????????如以上算法流程图中所述,由于最后需要最终层的所有状态个数,因此visited以字典的方式记录状态以及其对应的距离。 ????????由于numpy数组不能用作dict的key,所以,表示状态的numpy二维数组先变换为一维数组,然后转变为tuple,用作visited的key,而距离(层数, curStep)。存入队列时,则是将前述visited的key与距离(层数, curStep)组成一个嵌套式的tuple再存入。注意队列q与visited的这两种存储方式的区别。 ????????在每个格子上查询是否可以交换时,只考虑它与右边一格以及下边一格交换的可能性。这样按行扫描下去,不会遗漏也不会产生不必要的重复。这个技巧也是在前面的题目中已经出现过。 3. 代码及测试
运行结果: ????????N=4, M=4, ansSteps=10, numStates=64, ?1.380(sec) ????????N=4, M=6, ansSteps=20, numStates=4, 479.002(sec) 4. 后记? ? ? ? 这本书的压卷之题。但是看着顺眼一点(思路对上了^-^)所以就先拉出来办了。但是,以上题解虽然给出了正确解答,速度却实在不能恭维!需要严重优化。不过也是,压轴之题如果就这么简单地解决了也着实不像话(太不把村长当干部了)。欲知后事如何,且听下回分解。我会回来的。。。 ?????本系列总目录参见:程序员的算法趣题:详细分析和Python全解 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:20:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |