算法学习(2):BFS/DFS-广度优先/深度优先
来源:互联网 发布:广告联盟评测源码 编辑:程序博客网 时间:2024/05/17 22:43
DFS
- 思想:一直往深处走,直到找到目标或者走不下去为止。通常用递归来实现
- 使用栈保存未被遍历的结点,结点按照深度优先的次序被访问并被压入栈中,并以相反的次序出栈
- 应用:走迷宫,查找环路,查找联通区域
BFS
下面以走迷宫为例分别用DFS与BFS判断能否从迷宫的起始点走到终点
- 思想:先遍历所有的兄弟节点再遍历子节点,按层遍历。通常用队列来实现
- 使用队列保存未被检测的结点。结点按照广度优先的次序被访问和进出队列
- 应用:找最短的路径,或者到一个目标最短要几步
下面以走迷宫为例分别用DFS与BFS判断能否从迷宫的起始点走到终点
DFS
#include <stdio.h> int o[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };int map[10][10] = {0};int minStep = 100;int stack[100][2] = {0};int step = 0;int minStack[100][2] = {0};void DFS(int sY, int sX, int eY, int eX){if (step >= minStep)return;if (map[sY][sX] == 0)return;stack[step][0] = sY;stack[step++][1] = sX;map[sY][sX] = 0;if ((sY == eY) && (sX == eX)){if (minStep > step){minStep = step;for (int i = 0; i < step; i++){minStack[i][0] = stack[i][0];minStack[i][1] = stack[i][1];}}map[sY][sX] = 1;step--;return;}for (int i = 0; i < 4; i++){(DFS(sY + o[i][0], sX + o[i][1], eY, eX));}map[sY][sX] = 1;step--;return;}int main(int argc, char** argv){freopen("input.txt", "r", stdin);int N;scanf("%d\n", &N);for (int case_num = 0; case_num < N; case_num++){for (int i = 1; i <= 8; i++){for (int j = 1; j <= 8; j++){scanf("%d\n", &map[i][j]);}scanf("\n");}}DFS(1,1,8,8);printf("%d\n", minStep-1);for (int i = 0; i < minStep; i++){printf("%d %d\n", minStack[i][0], minStack[i][1]);}//if (ret)printf("success\n");//else printf("failed\n");}BFS
#include <stdio.h>int o[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };int map[10][10] = { 0 };int queue[100][2] = {0};int front = 0;int back = 0;int parent[10][10][2] = {0};void BFS(int sY, int sX, int eY, int eX){queue[back][0] = sY;queue[back++][1] = sX;map[sY][sX] = 1;while (front < back){int Y = queue[front][0];int X = queue[front][1];for (int i = 0; i < 4; i++){int newY = Y + o[i][0];int newX = X + o[i][1];if (map[newY][newX] == 0)continue;if (map[newY][newX] > (map[Y][X] + 1)){map[newY][newX] = map[Y][X] + 1;parent[newY][newX][0] = Y;parent[newY][newX][1] = X;if ((newY == eY) && (newX == eX)){return;}queue[back][0] = newY;queue[back++][1] = newX;}}front++;}}int main(int argc, char** argv){freopen("input.txt", "r", stdin);int N;scanf("%d\n", &N);for (int case_num = 0; case_num < N; case_num++){for (int i = 1; i <= 8; i++){for (int j = 1; j <= 8; j++){scanf("%d\n", &map[i][j]);if (map[i][j] == 1)map[i][j] = 100;//100 代表走过的}scanf("\n");}}BFS(1, 1, 8, 8);if (map[8][8] == 100)printf("failed\n");else printf("%d\n", map[8][8]);int x = 8, y = 8;int stack[100][2] = {0};int step = 0;while (x > 0 || y > 0){stack[step][0] = y;stack[step++][1] = x;int newY = parent[y][x][0];int newX = parent[y][x][1];x = newX;y = newY;}for (int i = step - 1; i >= 0; i--){printf("%d %d\n", stack[i][0], stack[i][1]);}}
阅读全文
0 0
- 算法学习(2):BFS/DFS-广度优先/深度优先
- BFS广度优先搜索 DFS深度优先搜索 回溯算法
- 图的深度(DFS)/广度优先搜索算法(BFS)/Dijkstra
- 树的广度深度优先遍历算法 DFS BFS
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- DFS深度优先搜索算法与BFS广度优先搜索算法的java实现
- DFS(深度优先搜索)与BFS(广度优先搜索)
- <广度优先搜素 BFS>和<深度优先搜索 DFS>
- 深度优先搜索(DFS)与广度优先搜索(BFS)
- 深度优先搜索(DFS)&广度优先搜索(BFS)
- 【数据结构】深度优先搜索BFS和广度优先搜索DFS
- 深度优先搜索(DFS)与广度优先搜索(BFS)
- 图的遍历 DFS(深度优先),BFS(广度优先)
- leetcode:深度优先搜索(DFS)和广度优先搜索(BFS)
- 【BFS】广度优先搜索&【DFS】深度优先搜索
- 深度优先搜索(DFS),广度优先搜索(BFS)
- 深度优先搜索和广度优先搜索( DFS&BFS )
- 剑指offer 菲波那切数列
- zabbix在windows下安装agent监控
- 【JavaScript学习】BOM:history对象
- (最小点覆盖 匈牙利算法)--pojMachine Schedule
- RabbitMQ四种交换机
- 算法学习(2):BFS/DFS-广度优先/深度优先
- IO流(copy文件,流转成PDF,流编码)
- 使用JDBC实现CRUD
- Gym 101503I Just Matrix【思维+拓扑排序】好题~
- 修改 mysql-binlog 二进制日志文件至其它目录
- jprofiler_监控远程linux服务器的JVM进程
- 端口扫描器的实现
- 重装-jdk配置,tomcat配置,sdk配置
- 理解 JavaScript 中的 for…of 循环