• 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

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

  • 相关阅读:
    php判断值是否为空
    MyQQ
    java动态定义二维数组问题
    回归CSDN
    字体工具栏
    传说中的服务器
    sql server 2000 出现不能执行查询,因为一些文件丢失或未注册
    chm文件打不开
    Cmd不能运行,窗口闪一下就消失
    isql病毒
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4530982.html
Copyright © 2020-2023  润新知