C++ はスタックを使用してハミルトン回路を実現します

チェス馬は M 行 N 列 (M、N は 6 以上の偶数、abs(MN)<=2) のボード上にあり、開始点が与えられます。馬は M*N 歩をジャンプして出発点に戻ります。そして、各チェッカーは 1 回だけジャンプします。この回路をハミルトン回路と呼びます。

開始点が与えられたと仮定すると: (ユーザーによる入力)、実行可能な解決策の 1 つを出力します。(チェス盤が 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