马的Hamilton周游路线

来源:互联网 发布:淘宝进货渠道去哪里找 编辑:程序博客网 时间:2024/05/22 14:23

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;elsereturn 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;} 



0 0