问题原型:
一只马在M*N的网格上跳来跳去,马走日,它走过的格子会变为黑色,请问它应如何才能将所有格子全部黑色?这个问题来源自微信上的一个游戏,当时是6*6的格子,我想很多方法都没有成功,最终总是有一个格子不能变成黑色。这里给出两种基本的方法:打表遍历和随机遍历(虽然有回朔法,但是本人能力有限,实现后会公布在这里。)
打表遍历:
不难想象,处于中间位置的马有8种走法(如果马的原始坐标为(0,0),则有(1,2)(2,1)(-1,2)(-2,1)(1,-2)(2,-1)(-1,-2)(-2,-1)共8种走法)。给这八种走法编号0-7,一共M*N步(假设走完),编程实现时可以先建立一个M*N的二维数组,并且建立一个长度为M*N的一维数组作为每一次遍历的路径指示。不断更新一维数组,直到找到目标路径。这里是实现的源代码:
#include<iostream>
#include<cstdlib>
using namespace std;
#define FAILED false
#define SUCCEED true
#define Len 5 //长度5
#define Wid 5 //宽度5
const int size = Len*Wid;
int currentx, currenty; //记录当前马所处的位置
long long times = 0; //记录遍历的次数
bool Go(int Array[Len][Wid],int Table[]); //走子函数
bool Vaild(int move,int Array[Len][Wid]); //结合当前马的位置判断Table[]中的移位是否合法
bool TableGenerate(int Table[]); //更新表Table[]
void OutPut(int Table[]); //输出表Table[]
int main()
{
int Array[Len][Wid];
memset(Array, 0, size*sizeof(int));
int Table[size] = { 0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0 };//表的初始状态(后面会说明)
cout << "请输入起始坐标:" << endl;
cin >> currentx >> currenty;
for (;;)
{
if (times % 1000000 == 0) //避免输出变得太快
{
cout << times << " tried. Route:";
OutPut(Table);
cout << endl;
}
if (Go(Array, Table) == SUCCEED) //如果走子函数返回成功,则输出所找到的路径
{
cout << "以找到路径:";
OutPut(