• hdu 1372 Knight Moves 解题报告


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372

            题目的意思是,在一个棋盘里,给出两点a和b,计算a到b的最小步数。玩过象棋的人应该都知道,“马”是走“日”的,这里的走法就是按“马”的走法来走。假设给出的点是(0,0),它下一步只能有8个选择,也就是(1, 2),(1,-2),(-1,2),(-1,-2),(2,1),(2,-1),(-2,1),(-2,-1)。

           这里还有两点要注意:1、输入的字符a-h要化成整型,以便在棋盘里构图。2、最终,每一个knight[i][j]保存的都是最少的步数,否则会递归地找到最少的move数

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int knight[8][8];
     5 int x[] = {1, 1, -1, -1, 2, 2, -2, -2};   //存储8个方向的点,每次用的时候x,y要同步,因为坐标点是由x、y组成的。                                         
     6 int y[] = {2, -2, 2, -2, 1, -1, 1, -1};
     7 
     8 void dfs(int i, int j, int move)
     9 {
    10     if (i < 0 || j < 0 || i > 7 || j > 7 || move >= knight[i][j]) //越界或统计的步数不小于knight[i][j]存储的步数则返回,说明knight[i][j]存储的步数不是最少的,继续递归找
    11         return;
    12     int k;
    13     knight[i][j] = move;        //保存当前的move,但有可能不是最优的move 
    14     for (k = 0; k < 8; k++)
    15     {
    16         dfs(i+x[k], j+y[k], move+1); //递归直到每一个knight[i][j]存储的步数最少,move作为计数器每次调用要+1
    17     }
    18 }
    19 
    20 int main()
    21 {
    22     char a[5], b[5];
    23     while (scanf("%s%s", a, b) != EOF)
    24     {
    25         memset(knight, 100, sizeof(knight));  //对knight的每个点赋予足够大的步数
    26         dfs(a[1]-'1', a[0]-'a', 0);       //字母代表列,数字代表行,都要化成整型(dfs的形参是整型)
    27         printf("To get from %s to %s takes %d knight moves.\n", a, b, knight[b[1]-'1'][b[0]-'a']); //输出的是到b点的最少步数
    28     }
    29     return 0;
    30 }
  • 相关阅读:
    Java垃圾回收机制
    Mybatis 通用 Mapper 和 Spring 集成
    MyBatis:SQL语句中的foreach的详细介绍
    PageHelper补充
    Mybatis分页插件PageHelper
    定时任务
    权限框架Apache Shiro 和 Spring Security
    Navicat操作数据库时一直显示加载中
    BigDecimal使用中的一些注意事项
    WPF应用程序嵌入第三方exe
  • 原文地址:https://www.cnblogs.com/windysai/p/3053893.html
Copyright © 2020-2023  润新知