乐在其中:无所不能用SQL挑战经典游戏汉诺塔

苏旭晖,网名 newkid

ITPUB开发版资深版主,SQL开发专家

编辑手记:感谢苏旭晖先生授权我们独家转载其系列精品文章,也欢迎大家向“Oracle”社区投稿。

SQL是一门非常灵活的语言,专家们用其挑战一切看似不可能。

问题来源

  汉诺塔是源自印度神话里的玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。   大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 传说   在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

题目要求

题目要求:用SQL找出最少移动次数,并且给出一种移法。 例子:3个圆盘 输入:N=圆盘个数

VAR N NUMBER; EXEC :N := 3;

输出:

7 1->2,1->3,2->3,1->2,3->1,3->2,1->2

每个步骤表示将一个柱子上的最上面一个圆盘移到另一个柱子。比如1->2 就是将1号柱最上方的圆盘放到2号柱的最上方。

思路分析

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

SQL解答

递归WITH:

WITH h(n,path,ended) AS ( SELECT 1,CAST('1->2' AS VARCHAR2(2000)),2 FROM DUAL UNION ALL SELECT n+1 ,path ||',1->'||DECODE(ended,2,3,2)||',' ||TRANSLATE(path,'123',DECODE(ended,2,'231','312')) ,DECODE(ended,2,3,2) FROM h WHERE n<:N ) SELECT POWER(2,n)-1 AS steps,path FROM h WHERE n=:N;

MODEL解法:

SELECT POWER(2,:N)-1 AS steps,path FROM (SELECT CAST('1->2' AS VARCHAR2(2000)) AS path,2 AS ended FROM DUAL) MODEL RETURN UPDATED ROWS DIMENSION BY (1 n) MEASURES (path,ended) RULES ITERATE(100) UNTIL(ITERATION_NUMBER=:N-2) ( path[1]=path[1] ||',1->'||DECODE(ended[1],2,3,2)||',' ||TRANSLATE(path[1],'123',DECODE(ended[1],2,'231','312')), ended[1]=DECODE(ended[1],2,3,2) ) ;

大家是否已经能够体会SQL的无穷魅力,参与定期的线上和线下技术分享,请加入我们的“云和恩墨大讲堂”!

近期文章

成就卓越:云和恩墨大讲堂期刊第三期

新年贺礼:云和恩墨大讲堂期刊第二期

删繁就简-云和恩墨的一道面试题解析

用SQL解一道数学题:Gauss和Poincare

新年贺礼:云和恩墨大讲堂期刊发行

2015 Oracle 十大热门文章精选

Oracle 12c ASM 防火防盗新特性揭秘

DBA入门之路:学习与进阶之经验谈

DBA入门之路:关于日常工作的建议

业务架构

电子渠道(网络销售)分析系统、数据治理

IT基础架构

分布式存储解决方案 | zData一体机 | 容灾环境建设

数据架构

Oracle DB2 MySQL NoSQL

专项服务:架构/安全/容灾/优化/整合/升级/迁移

运维服务:运维服务 代维服务

人才培养:个人认证 企业内训

软件产品:SQL审核、监控、数据恢复

应用架构

应用软件和中间件:数据建模 | SQL审核和优化 | 中间件服务

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-03-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人网

【干货】详解自动化机械臂维修&保养

自动化机械手可能会产生故障的原因:由于机械手衔接部位大大都是螺丝固定,可能会因为长时间震动形成螺丝松动松脱而形成机械手散架,部件的衔接块断裂等。另一方面机械手震...

3667
来自专栏程序员互动联盟

【程序员故事】三步把U盘变成MP3

程序员的故事,我们的故事。 1、下一关的出口在哪儿 一个电游玩家死后进入了地狱。一个星期之后,撒旦气急败坏地跑来问上帝:“你上周给我送过去的到底是个什么人?”...

2604
来自专栏Netkiller

竞猜活动区块链方案探索

竞猜活动区块链方案探索 合约实现了报名,退出,参加人数控制,竞猜次数控制,公布答案,获奖名单等等功能 pragma solidity ^0.4.20;// Au...

37810
来自专栏ml

nyoj------203三国志

三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5  描述 《三国志》是一款很经典的经营策略类游戏。我们的小白同学是这款游戏的忠实玩...

3175
来自专栏landv

金蝶K3 WISE BOM多级展开_销售成本表

1122
来自专栏PPV课数据科学社区

【笑话】程序猿才懂得幽默……第N波

1、上完厕所正准备走,隔间传来一阵哀怨的声音:“哥们,帮帮我好吗?”我叹了口气:“不带纸就敢蹲坑,你也是蛮拼的!”他尴尬地笑了笑,说:“不是,你能不能帮我去问下...

3045
来自专栏小狼的世界

妈呀,狼来了?

听听这充满诱惑的广告语、感受这不断被煽动的情绪,您有何感想呢?目前我们确实已经有了facebook、kaixin001、校内这样的社交网络,我们也有了twitt...

792
来自专栏数据和云

数据库流行度5月排行榜:Oracle企稳PostgreSQL飙升

五一假期,宣告2018年的1/3已然飘过,在匆匆流逝的时光里,有些变化潜移默化,有些变化轰轰烈烈,然而有紧迫感的人,必然计日以待、计日以行。

1012
来自专栏后端技术探索

程序员过生日,机智方式点蜡烛

1. 小区新搬来一户人家,一个30岁左右的年轻女人,带着一个4岁的男孩。每天独自一人操持家务,买菜做饭,接送孩子。时间久了,邻居们都有些议论,直到有一天,一个男...

631
来自专栏Guangdong Qi

小Q-免费的数据能做大事情之天气部分未完待续,持续更新中

1582

扫码关注云+社区