HOJ 1440 骑士巡游 BFS DFS

                                        HOJ  1440 骑士巡游 BFS  DFS

  题目链接:点击打开链接

           题目大意:

                   你 的一个朋友正在研究骑士巡游问题, 你的问题在于找到两个方格之间移动的最小步数,一旦您解决了这个问题 ,找到你的旅行方式就会变的简单

             你的工作时写一个程序,方格 A B 作为输入 决定A 到 B 最少的步数

           输入:

               输入会有多组测试 ,魅族测试 一行 表示两个方格位置 并且用 空格分开 每个 方格由子字母和数字组成

          输出:

                 输出格式为:To get from xx to yy takes n knight moves.".

           解题思路: 一看这道题会想棋盘搜索 ,记录步数,是搜索题 搜索有身搜和广度搜索,好像两种都可以 

         这里解释下深度优先搜索的概念   :

       DFS:     深度优先搜索 的算法 是沿着树的深度一直遍历 尽可能深的搜索树的分支  ,当节点 V的所有边的都已经 被搜索过 ,那么回溯 发现V的那条边的起始节点

               这一过程 ,一直进行到 已经发现从源节点到 所有节点为止, 如果还存在未发现的节点 ,那么 选择其中的一个作为源节点  并且重复以上过程 , 直到所有的节点                都搜索完为止,典型的盲目搜索。。。。 

               由于是一直往下 搜索 找到一个 然后堆起来 ,继续往下,搜索不下去了然后弹出来  ,类似于压栈 因此 需要用到 栈 


      BFS:    广度优先搜索  算法从任意节点V 开始 依次搜索其中一个可以扩展的每一个节点 当一层节点 全部搜索完 ,然后往下搜索 下一个可扩展的所有节点,知道所有                 均被访问, 可以看出 他是访问每一层 ,每一层先访问完然后先弹出 访问下一层 ,先进先出 ,要利用队列 进行实现

下面用广度优先解题:

  使用队列:

#include
#include
#include
#include
using namespace std;

struct ss
{
     int x;
     int y;
};

int main()
{ //骑士巡游问题
    //题题目大意 象棋中马的走法 是走日的 现在有 N M列棋盘进行遍历, 要你输出马的最终是怎么走的
      int dx[8] = {-2, -1, 1, 2, 1, 2, -1, -2};
      int dy[8] = { 1, 2, 2, 1, -2, -1, -2, -1};
      int dis[8][8];
      char st[8];
      char en[8];
      int i ;
      while(scanf("%s %s", st,en))
      {
          ss start ;
          ss end;
          memset(dis, -1, sizeof(dis)); //来标记是否走过
          start.x = st[0] - 'a';
          start.y = st[1] -'1';
          end.x  = en[0] - 'a';
          end.y = en[1] - '1';
          //下面采用宽度优先遍历的方式进行求解
          dis[start.x][start.y] = 0;
          queueq;
          q.push(start); //进队操作
          ss nex , tmp;
          if(start.x == end.x && start.y == end.y)
          {
              cout<<"To get from "<


你可能感兴趣的:(HOJ 1440 骑士巡游 BFS DFS)