C++利用栈实现汉密尔顿Hamilton回路

国际象棋的马在一个M行,N列的棋盘(M,N为大于等于6的偶数,并且abs(M-N)<=2)上,任给定一个起点。马连跳M*N步后回到起点。并且每个棋格只跳一次。我们称这个回路为汉密尔顿Hamilton回路。

假设任给定一个起点:(由用户输入),则输出其中一个可行解。(设棋盘为6*6的棋盘,则将1----36填入棋盘中,每个数字代表马走的路径)

参考数据为:

================================================ 

1.初始化 

#include <iostream>
#include <iomanip>  //setw函数需要,对齐格式用
using namespace std;

const int maxn=105;
int board[maxn][maxn]={0};//棋盘
int num=0;
int m,n;//棋盘大小
int startX,startY;//起点位置
//马的8种走法,用数组做一个记录,左上为0号方向,顺时针下来到7号方向。
int dx[8]={-2,-2,-1, 1, 2, 2, 1,-1};
int dy[8]={-1, 1, 2, 2, 1,-1,-2,-2};

我画了一个坐标系来方便理解dx[8]和dy[8]关于马的走法,从0号到7号以顺时针的顺序进行,如果在棋盘内该走法能够实现,就执行。

注意:该图只是为了方便理解呈现为坐标系形式,代码运行的棋盘则是从坐标轴x = 0往右递增,坐标轴y = 0往下递增。

 

 2.打印棋盘

setw(3)为打印出来的字体宽度为3

void output()
{
	for(int i = 0;i<m;i++)
    {
		for(int j = 0;j<n;j++)
			cout<<setw(3)<<board[i][j]<<" ";
		cout<<endl;
	}
}

 3.判断下一步是否到达终点

int toStart(int x,int y)
{
	for(int i = 0;i<8;i++)
		if(board[x+dx[i]][y+dy[i]]==1) //当前(x,y)的位置,8个方向中的其中一个位置能回到起点
			return 1;
	return 0;
}

4. 马走的函数

bool moveHorse(int x,int y,int num)
{
	if(num==m*n+1&&toStart(x,y))//达到终点并且走满棋盘
    {
		output();//输出棋盘
		return true;//找到路线
	}
	int xx=0,yy=0;
    for(int i = 0;i<8;i++)//对马可以跳的8个方向进行探测,顺时针进行探测
    {
        xx=x+dx[i],yy=y+dy[i];//下一步的坐标
        if((board[xx][yy] == 0)&&(xx>=0&&xx<m&&yy>=0&&yy<n))
        {//下一步为空并且未越界
            board[xx][yy]=num;//在棋盘上记录马的步数
            if(moveHorse(xx,yy,num+1)) //在该位置的基础上继续执行马走 
				return true;
            board[xx][yy]=0;//若该点的路线不能到达终点,则该位置清零以便下一次查找
        }
    }
    return false;
}

 ================================================

主函数

int main()
{
    //输入规模
    cout<<"输入规模;";
	cin>>m>>n;
	//输入起始位置
	cout<<"输入起始位置:" ;
	cin>>startX>>startY;
	board[startX][startY]=1;//将起始位置为1
	cout<<moveHorse(startX,startY,2); //初始位置的sum为1,故下一个位置的sum为2 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/henry594xiaoli/article/details/125581005