马的Hamilton周游路线

8*8的国际象棋棋盘上的一只马,恰好走过除起点外的其他63个位置各一次,最后回到起点,这条路线称为马的一条Hamilton周游路线。对于给定的m*n的国际象棋棋盘,m和n均为大于5的偶数,且|m-n|≤2,试设计一个分治算法找出马的一条Hamilton周游路线。

#include<stdio.h>
#include<stdlib.h>
#define max 101 

int m,n;//棋盘大小
int start_x,start_y;//起点位置
int dx[8]={-2,-1,1,2,-2,-1,2,1};
int dy[8]={-1,-2,-2,-1,1,2,1,2};
int board[max][max]={0};

int finish(int x,int y)
{//判断是否是死路 
	if(x<1 || y<1 || x>m || y>n || board[x][y]!=0)
		return 0;
	else
		return 1;
}
int next_move(int x,int y)
{//判断下一步能否回到起点 
	for(int i=0;i<8;i++)
		if(x+dx[i]==start_x && y+dy[i]==start_y) 
			return 1;
	return 0;
}
void show(int n,int m)
{//输出路线 
	for(int i=1;i<=m;i++) {
		for(int j=1;j<=n;j++)
			printf("%3d",board[i][j]);
		printf("\n");
	}		
}
void move(int x,int y,int num)
{
	if(num==n*m && next_move(x,y)) {
		show(n,m);
		exit(1);
	}
	for(int i=0;i<8;i++) {
		int next_x=x+dx[i];
		int next_y=y+dy[i];
		if(finish(next_x,next_y)) {
			board[next_x][next_y]=num+1;
			move(next_x,next_y,num+1);
			board[next_x][next_y]=0;
		}
	}
}
int main()
{
	printf("请输入棋盘的行数和列数:\n");
	scanf("%d%d",&m,&n);
	printf("请输入起始坐标:\n");
	scanf("%d%d",&start_x,&start_y);
	board[start_x][start_y]=1;
	int number=1;
	printf("马的周游路线为:\n");
	move(start_x,start_y,number);
	return 0;
} 

《马的Hamilton周游路线》

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/HLK_1135/article/details/52786611
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞