`
从此醉
  • 浏览: 1049907 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

BFS和DFS的路径输出

 
阅读更多


DFS 其实就是一直顺着一个方向不断的搜索直到找到了目标为止。路径输出的时候,利用记录前面的点即可。

举例

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 9

int cnt;
struct Point{
   int x;
   int y;
}path[N*N];
int maze[N][N];/*保存地图*/
int vis[N][N];/*标记哪一个点是否被访问过*/
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};/*方向数组*/
Point star , end;

/*路径输出,只要找到了目标就可以输出*/
void output(){
   printf("(%d , %d)->" , star.x , star.y);
   for(int i = 1 ; i < cnt-1 ; i++)
      printf("(%d , %d)->" , path[i].x , path[i].y);
   printf("(%d , %d)\n\n" , end.x , end.y);
   printf("\n");
}

/*深搜*/
void DFS(int x , int y , int step){
   int tmp_x , tmp_y;
   Point p;
 /*如果找到了目标,就调用output函数输出路径,然后return*/
 if(x == end.x && y == end.y){
      cnt = step;
      output();
      return;
   }
   for(int i = 0 ; i < 4 ; i++){
      tmp_x = x+dir[i][0];
      tmp_y = y+dir[i][1];
      p.x = tmp_x;
      p.y = tmp_y;
      if(!maze[tmp_x][tmp_y] && !vis[tmp_x][tmp_y]){
        vis[x][y] = 1;
        path[step] = p;/*标记前面一个点*/
        DFS(tmp_x , tmp_y , step+1);
        vis[x][y] = 0;/*回溯*/
      }
   }
}

int main(){
   memset(vis , 0 , sizeof(vis));
   DFS(star.x , star.y , 1);
   return 0;
}

BFS就是不断向四周扩展,然后找到目标节点;利用数组模拟队列(或者直接利用STL的队列,但是STL里面的队列对于保存路径有点麻烦),适用与求最小步数等。

举例:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;

#define MAXN 500010
#define N 10

int ans , end;
int sx , sy , ex , ey;/*sx sy是起点坐标,ex ey是终点坐标*/
int vis[N][N];
int dir[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};/*顺时针8个方向*/
char mp[N][N];
struct Point{/*结构体保存点的信息*/
   int x;
   int y;
   int pre;/*保存之前一个点的下标*/
   int d;/*保存来自哪一个方向*/
   int step;/*当前的步数*/
}p[MAXN];/*节点数组*/

void BFS(){
    int front , rear;
    front = 0 , rear = 1;/*初始化*/

    memset(vis , 0 , sizeof(vis));/*初始化为0*/
 /*初始化队列头节点的值*/
  p[front].x = sx , p[front].y = sy;
    p[front].pre = 0 , p[front].step = 0;
    vis[sx][sy] = 1;/*第一个点标记为1*/

    while(front < rear){
       Point tmp = p[front];/*取出队列的头然后头指针加加*/
       if(tmp.x == ex && tmp.y == ey){/*如果找到了*/
          end = front;/*记下最后一个点的下标*/
          ans = tmp.step;  /*求出最短的步数*/
          break;
       }
       front++;/*front相当与是STL的q.pop()*/
       for(int i = 0 ; i < 8 ; i++){/*枚举8个方向*/
          if(tmp.x+dir[i][0] <= 0 || tmp.x+dir[i][0] > 8)
            continue;
          if(tmp.y+dir[i][1] <= 0 || tmp.y+dir[i][1] > 8)
            continue;
          if(vis[tmp.x+dir[i][0]][tmp.y+dir[i][1]])
            continue;
          vis[tmp.x+dir[i][0]][tmp.y+dir[i][1]] = 1;/*标记为走过*/
          p[rear].x = tmp.x+dir[i][0] , p[rear].y = tmp.y+dir[i][1];
          p[rear].pre = front-1;/*记下前面一个的下标即为front-1*/
          p[rear].d = i;/*记下来自哪一个方向*/
          p[rear++].step = tmp.step+1;/*步数加1*/
       }
    }
}

/*利用回溯输出*/
void output(int x){
    if(x == 0)/*如果下标为0说明到达起点,那么回溯回去输出*/
      return;
    output(p[x].pre);
    printf("%s\n" , mp[p[x].d]);/*这里用到了方向的映射,比如上就是“U”*/
}

int main(){
    scanf("%d%d%d%d" , &sx , &sy , &ex , &ey);/*输入起点和终点的坐标*/
    BFS();
    printf("%d\n" , ans);
    output(end);
    return 0;
}




分享到:
评论

相关推荐

    BFS DFS 深度优先搜索 广度优先搜索 最短路径

    BFS DFS 深度优先搜索 广度优先搜索 图 输出所有路径 输出最短路径 随便输出一条可能的路径

    Floyd算法求任意两点间的最短距离+BFS+DFS

    用邻接矩阵来存储图,Floyed算法求任意两点间的最短路径并输出,广度优先遍历,深度优先遍历

    山东大学大二上数据结构实验图实验报告(含源码)

    创建无向图类,存储结构使用邻接链表,提供操作:插入一条边,删除一条边,BFS,DFS。 第一行输出图中有多少个连通分量 第二行输出所有连通子图中最小点的...第七行输出从s点到t点的最短路径,若是不存在路径则输出-1

    图路径问题及及生成树ppt,入门专用

    图路径问题及及生成树课件,有由多年带领ACM校队的老师讲授,对于图路径问题及及生成树问题讲得十分透彻,十分适合入门。

    c语言c++项目源代码_c语言支持自己创建迷宫,并求解最短路径.rar

    2. **最短路径求解**:基于BFS算法实现最短路径的查找,同时提供路径可视化输出。 3. **用户界面**:简洁直观的命令行界面,方便用户输入迷宫参数、执行生成和求解操作。 4. **数据结构优化**:采用链表和队列等高效...

    山东大学软件学院数据结构实验七图的操作

    1、 创建图类,存储结构使用邻接矩阵。 2、 输入图的节点数n(不超过10个)、边数m,节点分别用1-n代表。 3、 采用“起始节点,终止节点,权值”...6、 输出从第1节点到第n节点最短路径的长度,如果没有路经,输出0。

    myproject:8-拼图

    我的项目 8—拼图 8-puzzle问题的五种解决方案:BFS,DFS,IDS,IDA,A星 ...输出:最短路径为:4 5,一颗星 输入: 行和列的数初始和目标状态两个3 * 3矩阵 输出: 路线如下2 8 3 1 0 4 7 6 5 2 8 3 0 1 4 7 6 5

    【提高】小 X 学游泳(swim)

    一条路径的危险系数定义为这条路径所经过的方格的危险系数之和。 注意:这条路径不能经过同一个方格两次(小 X 当然不希望去那么危险的地方再游一次) 输入 输入数据第一行有两个用空格隔开的正整数 n 和 m, 表示...

    MazeGeneratorAndSolver:生成随机迷宫并解决它们

    然后程序将使用广度优先搜索 (BFS) 和深度优先搜索 (DFS) 来解决每个迷宫。 BFS 只找到一条也是最短路径的路径。 DFS 找到所有可用路径,找到的路径总数显示在最底部。 路径用 (#) 字符清楚地标出。 路径长度在每个...

    戳气球leetcode-Leetcode_notes:C++中的leetcode解决方案

    戳气球 leetcode 做题笔记 按照知识点分类 链表 链表反转 分治: 回溯/递归 全排列问题,用visited...输出所有路径 并查集 位运算 自己和自己异或 == 0 任何数字 异或 0 == 自己 389.找不同 二分查找 也可以双指针 旋转

    leetcode可以在线debug吗-solo:只要

    发挥的垃圾,linux和http写的很差,DFS+BFS输出路径debug不过 3.31 HR面(?为什么过了) 可以在上海实习,yeah! offer评估中 字节 飞书-tob线 上海 3.28 笔试 ac 2.8 3.31 一面 分布式RPC,GC中STW,spring的...

    计算机考研机试攻略 - 高分篇(试读).pdf

    1.4输入输出技巧 12 1.5头文件技巧 15 1.6数组使用技巧 16 1.7审时度势 — 复杂度与是否可做 19 1.8 C++ STL的使用 21 1.9多组输入的问题 27 第二章 入门经典 29 2.1 简单模拟 30 2.2 进制转换类问题 32 ...

    2025NOIP普及组.rar

    容易知如果数字i能变成数字j,那么i到j必须存在路径,否则i是不可能变成j的,这样一来,Fi的求解就显得非常简单了,求一个顶点v包括本身能到达的顶点数的方法相当多,可以用BFS,DFS,Dijkstra,Floyd,这里介绍一种...

    机器人算法汇总.pdf

    路径规划 基于图论的经典的路径规划算法有DFS,BFS,Dijkstra,Astra 智能路径规划算法有蚁群算法,遗传算法,模糊算法等 ii. 控制算法 ii.i. 决策算法 ii.ii. 运动控制算法 还未突破 fsm,决策树,遗传算法,神经⽹络...

    c语言数据结构算法演示(Windows版)

    左下显示有向图,其中顶点和弧的初始状态分别为绿色和黑色,从栈中退出的顶点(i)用红色表示,分别以蓝色和红色指示当前访问的邻接点(k)和它们之间的弧(ik),灰白色表示已经输出的顶点;右下显示顶点的入度;右上...

    学习数据结构算法必备

    (2)栈的输出序列(Gen、Perform) (3)递归算法的演示  汉诺塔的算法(Hanoi)  解皇后问题的算法(Queen)  解迷宫的算法(Maze)  解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值...

    java8源码-interview:面试

    数组a,先单调地址再单调递减,输出数组中不同元素个数。要求:O(1)空间复杂度,不能改变原数组 看 链表 基础 头插法 尾插法 双向链表 常见题 树 二叉树 基础 递归的先序、中序、后序 o(n) 非递归的先序、中序、后序...

    严蔚敏 数据结构算法演示(Windows版)软件

    (2)栈的输出序列(Gen、Perform) (3)递归算法的演示  汉诺塔的算法(Hanoi)  解皇后问题的算法(Queen)  解迷宫的算法(Maze)  解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值...

    数据结构算法演示(Windows版)

    (2)栈的输出序列(Gen、Perform) (3)递归算法的演示  汉诺塔的算法(Hanoi)  解皇后问题的算法(Queen)  解迷宫的算法(Maze)  解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值...

    如何学习ACM,看后受益匪浅

    图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流...

Global site tag (gtag.js) - Google Analytics