-------------------------------------------------------------
1 前言
-------------------------------------------------------------
用一句SQL实现国际象棋的马踏棋盘的演示程序。
起因:
《马踏棋盘》是最近朋友圈很火的一款小游戏,看谁可以用最少的步数不重复的走完国际象棋的6×6棋盘。在网上看到各种语言的解法,就想着试试用SQL来实现。
基本要求:
将马随机放在国际象棋的6×6棋盘的某个方格中,马按走棋规则进行移动。2种输出结果:
1)起始步算一步,走遍棋盘上全部36个方格。
2)起始步不算一步,走遍棋盘上其他35个方格后,回到起始步。
使用开发工具:
PL/SQL Developer(Version 11.0.0.1766)
-----------------------------------------------------------
2 技术要点
-------------------------------------------------------------
2.1 产生顺序值
通过SQL直接产生1~6的顺序值,值不写入数据表
2.2 马走日的数学模型
1)“马”在棋盘上需按国际象棋的规则“马走日”进行移动。整个棋盘可表示为一个6×6的二维数组,假若“马”目前在位置(i,j),则“马”下一步可移动的位置1、2……、7可分别表示为(i-2,j+1),(i-1,j+2),(i+1,j+2),(i+2,j+1),(i+2,j-1),(i+1,j-2), (i-1,j-2), (i-2,j-1),最多可移动的位置有8个。但是如果"马"位于棋盘的边界附近,它下一步可移动到的位置就不一定有8个了,因为要保证“马”每一步都走在棋盘中。
2)通过分析“马”的移动规则,会发现其规律符合绝对值原理,假设“马”要移动到的位置为(x,y),即(|i-x|=2 And |j-y|=1)或者(|i-x|=1 And |j-y|=2)。
2.3 递归查询connect by
通过递归来分析“马”的下一步走法
2.4 伪列(level)
用Level来记录当前步数
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余3页未读,立即下载