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<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
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;
          queue<ss>q;
          q.push(start); //进队操作
          ss nex , tmp;
          if(start.x == end.x && start.y == end.y)
          {
              cout<<"To get from "<<st<<" to "<<en<<" takes "<<0<<" knight moves."<<endl;
          }
          while(!q.empty())
          {
              nex = q.front() ;
              q.pop();//下面进行扩展操作
              for(i = 0 ;i < 8; i ++)
              {
                  int x = nex.x + dx[i];
                  int y = nex.y + dy[i];
                  if(0 <= x && x < 8 && 0 <= y && y < 8 && dis[x][y] == -1)
                  {
                         dis[x][y] = dis[nex.x][nex.y] + 1;
                         if(x == end.x  && y == end .y )
                         {
                             cout<<"To get from "<<st<<" to "<<en<<" takes "<<dis[x][y]<<" knight moves."<<endl;
                             break; //找到位置 输出结果, 程序循环停止
                         }
                         tmp.x = x;
                         tmp.y = y;
                         q.push(tmp);
                  }
              }

          }

      }
     return 0;
}


wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值