チェス馬は 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;
}