码迷,mamicode.com
首页 > 其他好文 > 详细

马踏棋盘--深度优先搜索

时间:2015-04-08 13:13:42      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:马踏棋盘   深度优先搜索   

题目描述:

8 * 8 的棋盘,“马“ 初始位置于 <0,0>,按 “日” 行走,一次性不重复踏遍整个棋盘,共有多少种方案?并打印行走方案。


补充:

这里测试8阶棋盘,貌似方案数会非常多,小生程序效率貌似不怎么样,十几分钟没跑完,所以拿5阶来测试。只需要改变代码中的
#define X 5
即可测试任何阶马踏棋盘游戏,阶数越高,程序运行时间将会越长。(8阶都不知道要跑到什么时候。。)

代码中
void CHorse::funcStart()
{

	funcTravel(0, 0, nStep);

}

通过修改funcTravel函数中的0,0即可选择"马"的初始位置。


源码:

#include <stdio.h>
#include <iostream>

#define X 5

using namespace std;


static int nChess[X][X] = {0};

class CHorse
{
public:
	
	CHorse();							       // 构造函数
	void funcStart();					       // 开始行走
	void funcCout();						   // 打印棋盘	
	void funcTravel(int x, int y, int n);	   // 从点<x,y>继续行走
	bool funcNextStep(int *x, int *y, int z);  // 寻找下一步可行点
	int  funcGetnCount();					   // 获取nCount


private:

	static int nCount;        // 统计总共的可行方案数

};


int CHorse::nCount = 0;


CHorse::CHorse()
{
}


int CHorse::funcGetnCount()
{
	return nCount;
}


void CHorse::funcStart()
{

	funcTravel(0, 0, 1);

}


void CHorse::funcTravel(int x, int y, int n)
{
	int nTraveli, nX1=x, nY1=y;
	nChess[x][y] = n;

	if( n==X*X )
	{
		// 棋盘遍历完毕
		funcCout();
	}
	else
	{
		// 循环遍历周边8个可行方案
		for(nTraveli=0; nTraveli<8; nTraveli++)
		{
			if( funcNextStep(&nX1, &nY1, nTraveli) )
			{
				funcTravel(nX1, nY1, n+1);
				nChess[nX1][nY1] = 0;
				nX1 = x;
				nY1 = y;
			}
		}
	}
}


bool CHorse::funcNextStep(int *x, int *y, int z)
{
	switch(z)
	{
	case 0:
		if( *x>1 && *y>0 && nChess[*x-2][*y-1]==0 )
		{
			*x = *x-2;
			*y = *y-1;
			return true;
		}
		break;

	case 1:
		if( *x<X-2 && *y>0 && nChess[*x+2][*y-1]==0 )
		{
			*x = *x+2;
			*y = *y-1;
			return true;
		}

		break;

	case 2:
		if( *x>1 && *y<X-1 && nChess[*x-2][*y+1]==0 )
		{
			*x = *x-2;
			*y = *y+1;
			return true;
		}
		break;

	case 3:
		if( *x<X-2 && *y<X-1 && nChess[*x+2][*y+1]==0 )
		{
			*x = *x+2;
			*y = *y+1;
			return true;
		}
		break;

	case 4:
		if( *x>0 && *y>1 && nChess[*x-1][*y-2]==0 )
		{
			*x = *x-1;
			*y = *y-2;
			return true;
		}
		break;

	case 5:
		if( *x<X-1 && *y>1 && nChess[*x+1][*y-2]==0 )
		{
			*x = *x+1;
			*y = *y-2;
			return true;
		}
		break;

	case 6:
		if( *x>0 && *y<X-2 && nChess[*x-1][*y+2]==0 )
		{
			*x = *x-1;
			*y = *y+2;
			return true;
		}
		break;

	case 7:
		if( *x<X-1 && *y<X-2 && nChess[*x+1][*y+2]==0 )
		{
			*x = *x+1;
			*y = *y+2;
			return true;
		}
		break;
	}
	return false;
}


void CHorse::funcCout()
{
	int i, j;

	nCount++;
	for(i=0; i<X; i++)
	{
		for(j=0; j<X; j++)
		{
			printf("%-4d", nChess[i][j]);
		}
		printf("\n");
	}
	printf("\n\n");
}


void main()
{
	int n;
	CHorse objHorse;
	objHorse.funcStart();
	printf("::马踏棋盘游戏::以<0,0>为起点的5阶棋盘共有%d种走法\n\n", objHorse.funcGetnCount());
}


效果图:

5阶:

技术分享


8阶(未跑完):

技术分享

马踏棋盘--深度优先搜索

标签:马踏棋盘   深度优先搜索   

原文地址:http://blog.csdn.net/bigric3/article/details/44937923

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!