1. 问题描述

2. 解题分析

搜索最短距离,图搜索问题中的最短距离问题,可以用广度优先搜索策略来解决。

2.1 搜索树示意图

搜索树示意图如下:

2.2 算法流程

用一维数组表示当前状态,但是要注意实际上表达的是围成一圈的状态。

2.3 实现要点

  1. 0号玩家第一步固定地从把手绢丢在位置0(1号玩家)后面开始,因此BFS从1号玩家作为runner开始。0号玩家需要的步数不要忘记
  2. 搜索过程中不仅要记录当前状态,还需要记录到目前为止累积步数,当前runner,已经当前runner从哪个位置出发
  3. 计算当前runner丢手绢交换位置的步数时,需要注意runner需要先跑到预定位置,然后再跑一圈才能进入位置
  4. 考虑到围成一圈的对成性以及本题只要求相对位置变为逆序,因此在以上用一维数组来表示排列状态时,目标状态不是一个而是经过循环移位后等价的N个。参见代码中的isTargets()

3. 代码及测试

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 23 08:04:30 2021@author: chenxy
"""import sys
import time
import datetime
import math
# import random
from   typing import List
from   collections import deque
import itertools as it
import numpy as npprint(__doc__)def isTargets(a, target):for k in range(len(target)):if np.array_equal(a, np.roll(target,k)):return Truereturn FalseN   = 6
s0  = np.arange(1,N+1)  # [1,2,3,...,N]
target = s0[::-1]       # In fact, all the circular shift of it are targets
s1     = s0.copy()
s1[0]  = 0              # [0,2,3,...,N]
q      = deque()
visited = set()
q.append((tuple(s1),N,1,0)) # (states, step, runner, start)
visited.add(tuple(s0))
visited.add(tuple(s1))# flog  = open("Q58.log", "w")
# flog.write('state, steps, runner, start')tStart  = time.perf_counter()
isOK = False
while len(q) > 0:cur,step,runner,start = q.popleft()  #used as Queue instead of Stack in BFS.# print(cur,step,runner,start)# flog.write('{0}, {1}, {2}, {3},\n'.format(cur,step,runner,start))if isTargets(cur, target):isOK = Truebreakfor k in range(N):nxt = np.array(cur)# interchange between runner and nxt[k]nxt_runner = nxt[k]nxt[k] = runnerif tuple(nxt) not in visited:visited.add(tuple(nxt))curSteps = ((k-start) if (k-start)>=0 else (k-start+N)) + N           q.append((tuple(nxt),step+curSteps,nxt_runner,k))if not isOK:print('Fails to reach the target states!')
# flog.close()        tCost  = time.perf_counter() - tStart
print('N={0}, steps = {1}, tCost = {2:6.3f}(sec)'.format(N,step,tCost))

运行结果:

N=6, steps = 48, tCost =  0.113(sec)

N=8, steps = 96, tCost = 21.311(sec)

4. 后记

运行时间太长了,需要进一步考虑优化。

N=8时的答案与原书答案是一致的,但是N=6时与原书给的题解要小(48 vs 51),经过仔细查验,确信原书给的答案不正确。原书给的移动过程所需要的步骤数的确更短,但是就总的移动距离而言我的更短。。。N=6时的我所得到的移动过程如下所示:

以上N=6的移动过程有兴趣的小伙伴可以检验。

心中有点小小的激动,找出一个“错误”不是一件容易的事情^-^。

上一篇:Q57: 最快的联络网

下一篇:Q59: 合并单元格的方式

本系列总目录参见:程序员的算法趣题:详细分析和Python全解

程序员的算法趣题Q58: 丢手绢游戏中的总移动距离相关推荐

  1. 程序员的算法趣题Q57: 最快的联络网

    目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...

  2. php算法求出一个数可以被分解成多少个_程序员的算法趣题

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  3. 程序员的算法趣题pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书是一本解谜式的趣味算法书,从实际应用出发,通过趣味谜题的解谜过程,引导读者在愉悦中提升思维能力.掌握算法精髓.此外,本书作者在谜题解答上,通 ...

  4. 程序员的算法趣题Q50: 完美洗牌

    目录 1. 问题描述 2. 解题分析 2.1 思路1 2.2 思路2 3. 代码及测试 4. 后记 1. 问题描述 问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得 ...

  5. LeetBook《程序员的算法趣题》Q18---水果酥饼日

    <程序员的算法趣题>-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言. Q18 水果酥饼日   日本每月的 22 日是水果酥 ...

  6. 程序员的算法趣题Q09: 落单的男女

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...

  7. 程序员的算法趣题Q55: 平分蛋糕

    目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...

  8. 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?

    目录 1. 问题描述 2. 解题分析 2.1 基本思路 2.2 动态规划 2.3 算法流程 3. 代码及测试 4. 后记 1. 问题描述 注意,本问题不区分人,只考虑各个座位被占用的不同顺序的个数. ...

  9. 程序员的算法趣题Q68: 异性相邻的座位安排(1)

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 后记 1. 问题描述 这道题的描述应该是有问题的(不知道是原文的问题还是翻译的问题). 前面的描述中提到"前后左右的座位全是异性 ...

最新文章

  1. 制造业人工智能8大应用场景
  2. C++难题之多态性详细解释
  3. linux udp套接字编程获取报文源地址和源端口(二)
  4. 说说WordPress的主查询函数-query_posts()
  5. docker如何实现重新打tag并删除原tag的镜像([仓库名: tag] 可以查询到指定id的镜像,同一个id镜像能有多个[仓库名: tag])(增加\删除镜像仓库:标签)
  6. 当模板方法遇到了委托函数,你的代码又可以精简了
  7. 【渝粤题库】广东开放大学 综合英语1 形成性考核 (2)
  8. python自动导出数据脚本_利用python生成一个导出数据库的bat脚本文件的方法
  9. 2013年1月7日学习内容
  10. 数据结构实验 8.寻找中位数
  11. 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack
  12. UltraEdit编辑器+注册机(windows版)
  13. 常见的弱口令字典1000~一石三鸟
  14. Matlab学习10-图像处理之傅里叶变换
  15. 2018服务商口碑榜Top50(3月)重磅出炉
  16. 弗兰克·盖里为华纳兄弟设计新总部,犹如漂浮在高速公路的‘冰山’
  17. 小白深度学习起步中——读取人像图像
  18. 简单获取速卖通aliexpress商品详情
  19. sklearn中transform和fit_transform的区别(解决中文向量化特征不一致问题)
  20. 海思3519A uboot开机画面

热门文章

  1. WPS中如何自动生成目录
  2. 嵌入式Linux 串口编程系列2--termios的VMIN和VTIME深入理解
  3. 微信小程序实战 (HelloWorld入门)
  4. ARP简介及ARP病毒原理
  5. 人听到坏消息的反应_形容突然间听到坏消息的成语有哪些?
  6. 每月一书(202211)天幕红尘
  7. 上亿条数据(GB级)文件去重解决方案
  8. nuke11命令启动不同版本的方法大全
  9. 计算机组成原理:cache命中率、平均访问时间、效率公式(精简)
  10. Google(谷歌浏览器)安装React developer tools 工具方法