Ka的回溯编程练习 Part5|跳马,又名马的遍历2
1 #include <stdio.h> 2 int TheEarthLand[6][6]={0}; 3 int HowToGoX[]={0,1,2,2,1,-1,-2,-2,-1}; 4 int HowToGoY[]={0,-2,-1,1,2,2,1,-1,-2}; 5 int total=0; 6 void op() 7 { 8 total++; 9 printf("<Way%d>:\n",total); 10 int i,j; 11 for(i=1;i<=5;i++) 12 { 13 for(j=1;j<=5;j++) 14 printf("%d ",TheEarthLand[i][j]); 15 printf("\n"); 16 } 17 } 18 void HereWeGo(int n,int x,int y) //已满足几个点 19 { 20 if(n==25) op(); //满足了25个点就输出 21 else 22 { 23 int i,Lox,Loy; //这里的坐标储存一定要用局部变量,不然出错 24 for(i=1;i<=8;i++) //八个方向都试试 25 { 26 Lox=x+HowToGoX[i]; //先得出此步的目的坐标 27 Loy=y+HowToGoY[i]; 28 if(Lox>=1&&Lox<=5&&Loy>=1&&Loy<=5&&TheEarthLand[Lox][Loy]==0) 29 {//如果坐标在棋盘内,而且这个点没来过 注意短路逻辑顺序 30 TheEarthLand[Lox][Loy]=n+1; //记录到点 31 HereWeGo(n+1,Lox,Loy); 32 TheEarthLand[Lox][Loy]=0;//回复现场 33 } 34 } 35 36 } 37 } 38 int main() 39 { 40 TheEarthLand[1][1]=1; //第一个点调1 41 HereWeGo(1,1,1); //第一个点,坐标(1,1) 42 return 0; 43 }
跳马问题。在5*5格的棋盘上,有一只中国象棋的马,从(1,1)点出发,按日字跳马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求在跳遍整个棋盘。
输出前5个方案及总方案数。
输出格式示例:
1 16 21 10 25
20 11 24 15 22
17 2 19 6 9
12 7 4 23 14
3 18 13 8 5
这个题主要在坐标传入的问题上需要注意:全局变量作为新坐标会导致坐标储存的混乱,必须使用局部变量储存新坐标