算法学习(2):BFS/DFS-广度优先/深度优先

来源:互联网 发布:广告联盟评测源码 编辑:程序博客网 时间:2024/05/17 22:43
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
原创粉丝点击