SQL 汉诺塔 自己原文公众号: https://mp.weixin.qq.com/s/0zh6zm_BoUnalAqvVD6qDg
上周我发布了一个SQL写的海盗分金子的(那个SQL不是我写的,我只是转述)。同样今天的这个也不是我写的。
背景是这样的一个游戏(这个游戏我是不会玩,但是见过),没想到我玩都不会玩的游戏,有人用SQL写了。
汉诺塔是源自印度神话里的玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。传说在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
题目要求
题目要求:用SQL找出最少移动次数,并且给出一种移法。
例子:3个圆盘
输入:N=圆盘个数

每个步骤表示将一个柱子上的最上面一个圆盘移到另一个柱子。比如1->2 就是将1号柱最上方的圆盘放到2号柱的最上方。
假设有N个盘,最底下的N号盘在移动的时候,目标的柱子一定是空的。所以所有的其他N-1个盘子必定全部在另一柱子上。 把N号盘移过去之后,N-1要叠加到这个盘上面,和刚才移动N-1个盘子的方法是一样的,只不过柱子的编号不同。 用递归SQL和MODEL都可以轻易写出来。
SQL解答
每个步骤表示将一个柱子上的最上面一个圆盘移到另一个柱子。比如1->2 就是将1号柱最上方的圆盘放到2号柱的最上方。
假设有N个盘,最底下的N号盘在移动的时候,目标的柱子一定是空的。所以所有的其他N-1个盘子必定全部在另一柱子上。 把N号盘移过去之后,N-1要叠加到这个盘上面,和刚才移动N-1个盘子的方法是一样的,只不过柱子的编号不同。 用递归SQL和MODEL都可以轻易写出来。
SQL解答
