问题描述:将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全部64个方格。求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。
这个算法的代码大概需要运行十几个小时,有兴趣的小伙伴可以试试,哈哈哈哈。
代码如下:
#include<stdio.h>
int cnt=0;
int kind=1; //一共有kind组解
int Move[8][2]={2,1,1,2,-1,2,-2,1,-2,-1,-1,-2,1,-2,2,-1};//移动的可能
int H[12][12];//棋盘
/*
函数作用:输出解
函数参数:无参数
无返回值
*/
void PrintHorse(){
printf("第%d组解:\n",kind++);
for(int i=2;i<10;i++){
for(int j=2;j<10;j++){
printf("%2d ",H[i][j]);
}
printf("\n\n");
}
}
/*
函数作用:马踏棋盘
函数参数:下一个要踏点位置
无返回值
*/
void Horse(int x,int y){
int a,b;
for(int i=0;i<8;i++){
a=x+Move[i][0];
b=y+Move[i][1];
if(H[a][b]==0){
H[a][b]=++cnt;
if(cnt==64){
PrintHorse();
}else{
Horse(a,b);
}
H[a][b]=0;
cnt--;
}
}
}
//创建棋盘
void CreatChessBoard(){
for(int i=0;i<12;i++){
for(int j=0;j<12;j++){
H[i][j]=-1;
}
}
for(int i=2;i<10;i++){
for(int j=2;j<10;j++){
H[i][j]=0;
}
}
}
int main(void){
//循环一次 换一个起始点
for(int i=2;i<10;i++){
for(int j=2;j<10;j++){
CreatChessBoard();//创建并初始化棋盘
cnt=0;
H[i][j]=++cnt;
//马踏棋盘开始
Horse(i,j);
}
}
}
结果如下:
由于有太多组解,所有我就随便截图了几组