NYOJ 58 最少步数(dfs或者bfs)


       这道题最开始是用dfs做的,后来学会了bfs以后有一次用bfs做了这道题,但是奇迹般的TLE了,当时还纠结了半天最少步数竟然不能用bfs做吗?然后刚刚又用bfs交了一次,又奇迹般的AC了,这道题可以当作bfs的模板了。下面把bfs和dfs的代码都贴上吧。


AC代码(DFS):

#include <iostream>
#include <cstring>
using namespace std;
int MAP[9][9] = { 1,1,1,1,1,1,1,1,1,          //定义地图
                  1,0,0,1,0,0,1,0,1,
                  1,0,0,1,1,0,0,0,1,
                  1,0,1,0,1,1,0,1,1,
                  1,0,0,0,0,1,0,0,1,
                  1,1,0,1,0,1,0,0,1,
                  1,1,0,1,0,1,0,0,1,
                  1,1,0,1,0,0,0,0,1,
                  1,1,1,1,1,1,1,1,1};
int dir[4][2] =  {1,0,0,1,-1,0,0,-1};          // 控制走的四个方向
int vis[9][9];                                 // 标记数组
int n,step,INF;
int S_x,S_y,E_x,E_y;

void dfs(int x,int y,int step){
  if(E_x==x &&E_y == y){              // 达到终点后取最小的那个值
    if(INF>step)
    INF=step;
    return ;
  }
  for(int i=0;i<4;i++){
    int X = x + dir[i][0];
    int Y = y + dir[i][1];
    if(X>=0&&Y>=0&&X<9&&Y<9&&MAP[X][Y]==0&&vis[X][Y]==0){
      vis[X][Y] = 1;
      dfs(X,Y,step+1);
      vis[X][Y] = 0;           // 出来时要取消标记
    }
  }
}
int main()
{
  cin>>n;
  while(n--){
    step = 0;               // 将步数初始化为0
    INF = 0x3f3f3f3f;       // 因为要求最少步数,所以将INF初始化为最大值
    memset(vis,0,sizeof(vis));
    cin>>S_x>>S_y>>E_x>>E_y;
    dfs(S_x,S_y,step);
    cout<<INF<<endl;
  }
  return 0;
}
/***
   [来源] NYOJ 58
   [题目] 最少步数
   [大意]
      就是一道入门的搜索题,也算是模板题了。详细看代码注释吧。
   [输入]
       2
       3 1 5 7
       3 1 6 7
    [输出]
       12
       11
*/


AC代码(BFS):


#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int MAP[9][9] = { 1,1,1,1,1,1,1,1,1,          //定义地图
                  1,0,0,1,0,0,1,0,1,
                  1,0,0,1,1,0,0,0,1,
                  1,0,1,0,1,1,0,1,1,
                  1,0,0,0,0,1,0,0,1,
                  1,1,0,1,0,1,0,0,1,
                  1,1,0,1,0,1,0,0,1,
                  1,1,0,1,0,0,0,0,1,
                  1,1,1,1,1,1,1,1,1};
int dir[4][2] =  {1,0,0,1,-1,0,0,-1};          // 控制走的四个方向
int vis[9][9];                                 // 标记数组
int n;
struct Node{
  int x,y,step;
}Now,Next,S,E;

int bfs(){                                // 广搜
  memset(vis,0,sizeof(vis));              // 清空标记数组
  queue<Node> q;                          // 定义队列
  S.step = 0;
  q.push(S);            // 入队
  while(!q.empty()){    // 如果队列不是空的就循环
    Now = q.front();    // 读取队首元素
    q.pop();            // 把队首弹出
    if(Now.x == E.x && Now.y == E.y){         // 当走到终点返回步数
      return Now.step;
    }
    for(int i=0;i<4;i++){
      Next.x = Now.x + dir[i][0];
      Next.y = Now.y + dir[i][1];
      if(Next.x >=0 && Next.y >=0 && Next.x < 9 && Next.y < 9 && MAP[Next.x][Next.y]==0 && vis[Next.x][Next.y]==0){
        vis[Next.x][Next.y] = 1;
        Next.step = Now.step + 1;
        q.push(Next);
      }
    }
  }
  return -1;
}

int main()
{
  scanf("%d",&n);
  while(n--){
    cin>>S.x>>S.y>>E.x>>E.y;
    int temp = bfs();
    printf("%d\n",temp);
  }
  return 0;
}


全部评论

相关推荐

现在是2026.2.27,距离我2025.8.16在boss上投出第一份简历以来已经过去了半年多时间了。可能许多牛友对我并不陌生,在去年的89月份,深陷实习焦虑的我不停的在牛客上发帖求助,改过的简历不知道发了多少次。因为双非本的缘故,在实习这条路上可谓是处处碰壁。boss上四位数的沟通只换来两位数的回复,好不容易约到的面试很多还因为各种原因被挂。最终在9月底遇到了我实习过程中的第一个贵人:美团实习的ld。尽管那是个测开岗,但是没有关注我实际的技术栈,而是用专业的提问让我感受到了前所未有的面试体验,发掘了自己的技术闪光点。最终让我决定放弃了另一家中小厂的后端。他们非常尊重我对开发学习的热情,也给足了我自由发挥的空间,如果不是他们让我深度参与的用例生成项目,我或许连接到后面面试的机会都没有。尽管岗位不是开发,但这个过程中对大厂工作流程的深度参与以及对业务,项目,和技术的思维提升对我后续的开发面试一样提供了巨大的帮助。时代的洪流让我们每个人都被迫卷入其中,错过了互联网的红利时期,无论实习还是秋招都令不同背景的同学倍感压力,尽管如此我们依旧要相信:努力定有回报最后祝各位27的兄弟姐妹们,在暑期实习的面试路上一路披荆斩棘,策马扬鞭,用梦中情司的offer回应自己一直以来不愿放弃的拼搏timeline:2.6一面2.11&nbsp;二面2.12&nbsp;三面&nbsp;当天转hr面2.26&nbsp;hr面,面完云证+录用评估2.27&nbsp;offer
EternalRig...:看完太感人了吧,你这是真正的一路生化
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务