完整CLion下工程,见:https://github.com/dingjiefeng/DataStructures-Algorithms_Cpp/tree/master/algorithm
马踏棋盘问题即在一个8*8的棋盘上,指定一个起点,找到一个路径,让棋子按照马走日的规则将所有格子无重复的遍历一次。
这个问题是在学习数据结构与算法的时候看到的,当时看的是C语言的版本,也没记住具体的解法,事后回顾起来觉得很有意思,于是自己用C++编写了一段代码尝试一下。
首先进行分析:从数据结构的角度来分析,一个棋盘可以看作一个二维数组。然后是对每次落子进行分析,根据马走日的规则,假设不考虑是否会出现越界情况,则在某位置X上,下一步落子共有八种可能性,如图所示,按照顺时针顺序依次标记为0,1,2,3,4,5,6,7:
- | 7 | - | 0 | - |
6 | - | - | - | 1 |
- | - | X | - | - |
5 | - | - | - | 2 |
- | 4 | - | 3 | - |
那么显然易见,已知X的情况下,利用深度优先遍历的方式,是一定可以得到一个路径满足要求的,只不过这么做的计算复杂度非常之高。有了想法,当然是以能跑出结果为导向先写出大概的代码才行,于是我按照这个思路写出了原始版本:
/*
* 马踏棋盘最原始的深度优先算法
* 利用栈
*/
#include
#incl