贪心+回溯算法之马踏棋盘问题

问题描述:将马随机放在国际象棋的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);
		}
	}
}

结果如下:

由于有太多组解,所有我就随便截图了几组

猜你喜欢

转载自blog.csdn.net/qq_39241239/article/details/81277622
今日推荐