马的遍历问题(自己的一些见解,可能是拙略的)

本文讨论了马在M*N网格上按日字形移动,使所有格子变黑的问题。提出了打表遍历和随机搜索两种方法。打表遍历通过建立二维数组记录路径,但效率较低;随机数搜索法通过不断生成随机走法,直至找到解决方案,时间消耗与网格大小相关。
摘要由CSDN通过智能技术生成

问题原型:

一只马在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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值