首页 > 其他分享 >Hanoi Tower: 变形/总结

Hanoi Tower: 变形/总结

时间:2023-08-23 17:47:39浏览次数:58  
标签:状态 变形 Hanoi 往右 Tower 移动 盘子 上面 rightarrow

省流:没有更新完成,正在慢慢更新。

Hanoi Tower 问题本身很简单,A,B,C 三个柱子,起初每一个圆盘都在 A 上,想要全部移动到 B/C。每次只能移动最上面的,大的在小的圆盘下面。

Original Problem/原问题

考虑一个递归函数。\(hanoi(n,A,B,C)\) 代表目标是把 \(N\) 这个大小的盘子通过 B 从 A 移动到 C。

void hanoi(int n,char A,char B,char C){
	if (n){
		hanoi(n-1,A,C,B);
		cout<<A<<"->"<<C<<endl;
		hanoi(n-1,B,A,C);
	}
}

步数是 \(2^n-1\)。总共状态是 \(2^n\) 个(包含最前面的)。

  • 最优是 \(2^n-1\)。对于一个盘子 \(x\),它的希望是 \(1\cdots x-1\) 都从它身上下来,它移动一下,\(1\cdots x-1\) 都再爬到他身上。没有步数的浪费,所以是最优。

  • 总共状态是 \(2^n\) 个。最多 \(2^n\) 个。如果有两个重复的,一定不是最优解(可以把中间的去掉)。

一共有 \(3^n-2^n\) 个状态不能达到。

A More Abstract Way/一个更抽象的方式

因为有 \(2^n\) 个状态可以达到,就可以用长度为 \(n\) 的二进制串来表示每一个状态,一共 \(2^n\) 个。我们可以尝试用 \(+1\) 来表示一步,从 \(0\) 加到 \(2^n-1\) 就做完了。

  • 如果一个 \(+1\) 不进位,就代表 \(1\) 号盘子往右移动了 \(1\) 步。

  • 反之,那个从 \(0\) 变成 \(1\) 的对应的盘子,移动到它可以移动的位置。

例如:\(3\) 个盘子。

  • \(000\rightarrow 001\):\(A\rightarrow B\)。

  • \(001\rightarrow 010\):\(A\rightarrow C\)。

  • \(010\rightarrow 011\):\(B\rightarrow C\)。

  • \(011\rightarrow 100\):\(A\rightarrow B\)。

  • \(100\rightarrow 101\):\(C\rightarrow A\)。

  • \(101\rightarrow 110\):\(C\rightarrow B\)。

  • \(110\rightarrow 111\):\(A\rightarrow B\)。

(\(X\rightarrow Y\) 代表 \(X\) 最上面的移动到 \(Z\))

为什么是对的?

一个大一点的例子: \(000000\)。第一个 \(0\) 要变成 \(1\),要经过 \(011111\rightarrow 100000\rightarrow 111111\)。对于每一位都是。也就相当于上面的盘子移开,自己移好,再把其他盘子移上来。

Change \(1\): Only Adjacent/只能相邻

现在在原问题的规定上,只能 \(A\rightarrow B,B\rightarrow C,C\rightarrow B,B\rightarrow A\)。这样,要几步呢?答案不难猜到,\(3^n-1\)。

一个盘子想要移动到最终的位置上,怎么办?

  • 上面的盘子往右 \(2\) 步。

  • 自己往右 \(1\) 步。

  • 上面的盘子往左 \(2\) 步。

  • 自己往右 \(1\) 步。

  • 上面的盘子往右 \(2\) 步。

按照上面二进制的方法,这边就变成了三进制。

  • \(+1\) 不进位:\(1\) 往左/右 \(1\)。

  • 反之,对应的一个盘子移动。

这种变形还有一个性质,就是一共有 \(3^n\) 个状态,它都可以达到,而且没有重复的。如果把互相可以达到的状态连一条边,从 \(AAA\) 走到 \(CCC\),会形成一个很好看的形状

(别人的图)

可以发现,原问题是最短路,这个,是最长路。

Change \(2\): Unreached Count/不能达到的状态

原问题中,如果我们最终全部放到 B,对于一个状态,怎么判断它能不能到?

标签:状态,变形,Hanoi,往右,Tower,移动,盘子,上面,rightarrow
From: https://www.cnblogs.com/SFlyer/p/17649863.html

相关文章

  • 数字变形
    此题目来源于LZOI题目传送门#include<iostream>usingnamespacestd;intmain(){intn;cin>>n;inthundreds=n/100;inttens=(n/10)%10;intones=n%10;inttransformed=ones*100+tens*10+hundreds;......
  • 处理img 变形的问题
    图片被挤压变形了给img添加 object-fit:cover;之后 ......
  • 使用 Habana Gaudi2 加速视觉语言模型 BridgeTower
    在对最先进的视觉语言模型BridgeTower进行微调时,使用OptimumHabanav1.6,HabanaGaudi2可以达到近3倍于A100的速度。硬件加速的数据加载以及fastDDP这两个新特性对性能提高贡献最大。这些技术适用于任何性能瓶颈在数据加载上的其他工作负载,很多视觉模型的性能瓶颈在......
  • css 中强制换行后,伪类元素变形,用到的flex-shrink 属性
    之前都没用过这个属性,最近做项目遇到一个不同屏幕下可能会换行的问题,设置了强制不换行,但是伪类元素就没挤没了,请教了同事,用到了flex-shrink属性然后我就去看了看这个属性的用法,简单记录一下flex-shrink属性指定了flex元素的收缩规则。flex元素仅在默认宽度之和大于容器的时......
  • 像建房子一样打造变形金刚,追梦女孩要刚强
    Transformer鼎鼎大名人尽皆知,2017年就问津于世,鸽鸽2023年才学习它,任何时候圆梦都不算晚!本文记录了我像建房子一样从头到尾打造变形金刚的全过程,目的是熟悉pytorch和深入理解transformer。先看下我设定的任务难度,我们要解决的是经典的seq2seq翻译任务。使用的数据集是中英新闻评论......
  • 像建房子一样打造变形金刚,追梦女孩要刚强(二)
    今天的任务很艰巨,需要把下面这张图的模型架构复现一遍,要有耐心哦。我参考了哈佛NLP小组对transformer的分拆讲解TheAnnotatedTransformer,但思路不同于原文。原文是从整体到局部,而我是从局部到整体。我们先把Day1的嵌入层复制过来(使用的是harvard的版本):fromtorchimportTenso......
  • JOI2013 JOIOI の塔 (Tower of JOIOI)题解
    Description给定一个由J、O、I组成的字符串,求最多能拆分成多少JOI或IOI。对于所有数据,\(1\leq\vertS\vert\leq10^6\)。Solution先处理出\(\text{pre}_i\)为前缀J和I的数量,即能组成多少个头部。然后倒着做,维护当前拼出的I、OI和最终成品的数量。遇到J、O就......
  • 完整链条监测岩土工程变形:振弦传感器、振弦采集仪和在线监测系统案例
    完整链条监测岩土工程变形:振弦传感器、振弦采集仪和在线监测系统案例在岩土工程监测中,振弦传感器和振弦采集仪是常用的监测设备。下面是一个振弦传感器和振弦采集仪与在线监测系统形成一套完整链条的岩土工程监测案例:案例描述:某地区进行隧道掘进工程,在掘进过程中需要进行岩体的......
  • 岩土工程变形的全链监测:振弦传感器、振弦采集仪及在线监测系统案例
    岩土工程变形监测是实时监测工程结构体变形情况的重要手段,常用的岩土工程变形监测方法包括测量标志物、光纤光栅传感器、位移传感器等。其中,振弦传感器和振弦采集仪可以实现对岩土体深部位移的实时监测,被广泛应用于大型岩土工程结构的变形监测。振弦传感器是一种利用能量传输的方......
  • A008 《变形记》编程 源码
    一、课程介绍本节课将通过修改画笔的外形,创作一些有趣的作品。二、知识重难点解析画笔外形shape()画笔调用shape()方法,可以设置画笔“外形”,默认是classic,其他形状如下:如:importturtlep=turtle.Pen()p.shape('circle')#画笔设置成“圆”外形turtle.done()添加外形a......