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 深度优先搜索 广度优先搜索 图 输出所有路径 输出最短路径 随便输出一条可能的路径
用邻接矩阵来存储图,Floyed算法求任意两点间的最短路径并输出,广度优先遍历,深度优先遍历
创建无向图类,存储结构使用邻接链表,提供操作:插入一条边,删除一条边,BFS,DFS。 第一行输出图中有多少个连通分量 第二行输出所有连通子图中最小点的...第七行输出从s点到t点的最短路径,若是不存在路径则输出-1
图路径问题及及生成树课件,有由多年带领ACM校队的老师讲授,对于图路径问题及及生成树问题讲得十分透彻,十分适合入门。
2. **最短路径求解**:基于BFS算法实现最短路径的查找,同时提供路径可视化输出。 3. **用户界面**:简洁直观的命令行界面,方便用户输入迷宫参数、执行生成和求解操作。 4. **数据结构优化**:采用链表和队列等高效...
1、 创建图类,存储结构使用邻接矩阵。 2、 输入图的节点数n(不超过10个)、边数m,节点分别用1-n代表。 3、 采用“起始节点,终止节点,权值”...6、 输出从第1节点到第n节点最短路径的长度,如果没有路经,输出0。
我的项目 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 当然不希望去那么危险的地方再游一次) 输入 输入数据第一行有两个用空格隔开的正整数 n 和 m, 表示...
然后程序将使用广度优先搜索 (BFS) 和深度优先搜索 (DFS) 来解决每个迷宫。 BFS 只找到一条也是最短路径的路径。 DFS 找到所有可用路径,找到的路径总数显示在最底部。 路径用 (#) 字符清楚地标出。 路径长度在每个...
戳气球 leetcode 做题笔记 按照知识点分类 链表 链表反转 分治: 回溯/递归 全排列问题,用visited...输出所有路径 并查集 位运算 自己和自己异或 == 0 任何数字 异或 0 == 自己 389.找不同 二分查找 也可以双指针 旋转
发挥的垃圾,linux和http写的很差,DFS+BFS输出路径debug不过 3.31 HR面(?为什么过了) 可以在上海实习,yeah! offer评估中 字节 飞书-tob线 上海 3.28 笔试 ac 2.8 3.31 一面 分布式RPC,GC中STW,spring的...
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 ...
容易知如果数字i能变成数字j,那么i到j必须存在路径,否则i是不可能变成j的,这样一来,Fi的求解就显得非常简单了,求一个顶点v包括本身能到达的顶点数的方法相当多,可以用BFS,DFS,Dijkstra,Floyd,这里介绍一种...
路径规划 基于图论的经典的路径规划算法有DFS,BFS,Dijkstra,Astra 智能路径规划算法有蚁群算法,遗传算法,模糊算法等 ii. 控制算法 ii.i. 决策算法 ii.ii. 运动控制算法 还未突破 fsm,决策树,遗传算法,神经⽹络...
左下显示有向图,其中顶点和弧的初始状态分别为绿色和黑色,从栈中退出的顶点(i)用红色表示,分别以蓝色和红色指示当前访问的邻接点(k)和它们之间的弧(ik),灰白色表示已经输出的顶点;右下显示顶点的入度;右上...
(2)栈的输出序列(Gen、Perform) (3)递归算法的演示 汉诺塔的算法(Hanoi) 解皇后问题的算法(Queen) 解迷宫的算法(Maze) 解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值...
数组a,先单调地址再单调递减,输出数组中不同元素个数。要求:O(1)空间复杂度,不能改变原数组 看 链表 基础 头插法 尾插法 双向链表 常见题 树 二叉树 基础 递归的先序、中序、后序 o(n) 非递归的先序、中序、后序...
(2)栈的输出序列(Gen、Perform) (3)递归算法的演示 汉诺塔的算法(Hanoi) 解皇后问题的算法(Queen) 解迷宫的算法(Maze) 解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值...
(2)栈的输出序列(Gen、Perform) (3)递归算法的演示 汉诺塔的算法(Hanoi) 解皇后问题的算法(Queen) 解迷宫的算法(Maze) 解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值...
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流...