数据结构之深度优先搜索(用栈实现)问题

来源:互联网 发布:诗歌音步 知乎 编辑:程序博客网 时间:2024/05/18 01:12

深度优先搜索

可以这样理解,向四边延伸搜索,然后遇到不能搜索的时候就回退,也就是回溯思想,然后再去其它可能地方搜索。


题目:

定义一个二维数组:

int maze[5][5] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。程序如下:

#include<stdio.h>#define MAX_ROW 5#define MAX_COL 5int top = 0;struct Node {    int row;    int col;} stack[512];int maze[MAX_ROW][MAX_COL] = {    0, 1, 0, 0, 0,    0, 1, 0, 1, 0,    0, 0, 0, 0, 0,    0, 1, 1, 1, 0,    0, 0, 0, 1, 0,};void push_stack(struct Node node){     stack[top++] = node;}struct Node pop_stack(){    return stack[--top];}int is_empty() {   return top == 0;}void printf_stack(){    for (int i = 0; i < MAX_ROW; i++)    {        for (int j = 0; j < MAX_COL; j++)        {            printf("%d\t", maze[i][j]);        }        printf("\n");    }    printf("***********\n");}/* *这里需要放坐标的二位数组 * */struct Node before[MAX_ROW][MAX_COL] = {   {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}},   {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}},   {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}},   {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}},   {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}},};void visit(int row, int col, struct Node p){    struct Node node = {row, col};    maze[row][col] = 2;    before[row][col] = p;    push_stack(node);}int main() {    struct Node p = {0, 0};    maze[p.row][p.col] = 2;    push_stack(p);    while (!is_empty()) {//这里我写成了!is_empty,忘记写(),以后一定要记得写,日了狗          p = pop_stack();          if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {              break;          }          if (p.col + 1 < MAX_COL && maze[p.row][p.col + 1] == 0)          {              visit(p.row, p.col + 1, p);  /**右边**/          }          if (p.row + 1 < MAX_ROW && maze[p.row + 1][p.col] == 0)          {              visit(p.row + 1, p.col, p); /**下边**/          }          if (p.col - 1 >= 0 && maze[p.row][p.col - 1] == 0)          {             visit(p.row, p.col - 1, p); /**左边**/          }          if (p.row - 1 >= 0 && maze[p.row - 1][p.col] == 0)          {             visit(p.row - 1, p.col, p); /**上边**/          }          printf_stack();    }    if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {       printf("%d,%d\n", p.row, p.col);       while (before[p.row][p.col].row != -1) {            p =  before[p.row][p.col];            printf("%d,%d\n", p.row, p.col);       }    } else {      printf("no this path");    }    return 0;}


结果展示:


2100021010000000111000010***********2100021010200000111000010***********2100021010220002111000010***********2100021010220002111020010***********2100021010220002111022010***********2100021010220002111022210***********2100021010220002111022210***********2100021010222002111022210***********2100021210222202111022210***********2120021210222202111022210***********2122021210222202111022210***********2122221210222202111022210***********2122221212222202111022210***********2122221212222222111022210***********2122221212222222111222210***********2122221212222222111222212***********4,43,42,41,40,40,30,21,22,22,12,01,00,0



0 0
原创粉丝点击