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>:
",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("
");
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

这个题主要在坐标传入的问题上需要注意:全局变量作为新坐标会导致坐标储存的混乱,必须使用局部变量储存新坐标

原文地址:https://www.cnblogs.com/KakagouLT/p/4530982.html