数据结构之简单迷宫求解

迷宫问题我们都知道,在一张地图中寻找一条路可以走出去,所以我们可以建立这样一个地图
这里写图片描述
如图所示,我们的思路是这样的:我们可以规定0就是墙,而1 就是我们要走的路,可以落脚后,我们就将走过的点标记为2
然后顺时针递归探测下一个可以落脚的点,通过回溯法,我们就可以通过栈结构完成我们最简单的迷宫寻路
回溯法
我们从入口点进入,进行搜索路线,如果我们发现当前道路不通的时候,我们就会回溯到上一个点,然后判断能不能继续走,如果还是不能,那么我们就继续回溯,直到找到可以走的点
下面就是我们的代码具体实现

maze.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

#define MAX_ROW 6
#define MAX_COL 6

typedef struct maze{
    int map[MAX_ROW][MAX_COL];
}maze;
typedef struct point{
    int row;
    int col;
}point;
typedef point seqstacktype;
typedef struct seqstack{
    seqstacktype *data;
    size_t size;
    size_t capacity;
}seqstack;
maze.c


#include "maze.h"


int map[MAX_ROW][MAX_COL] = {
    {0,1,0,0,0,0},
    {0,1,1,1,0,0},
    {0,1,0,1,1,0},
    {0,1,1,0,0,0},
    {0,0,1,0,0,0},
    {0,0,1,0,0,0}
};
void mazeinit(maze *maze)
{
    if(maze == NULL)
    {
        return;
    }
    size_t i = 0;
    for(;i<MAX_ROW;i++)
    {
        size_t j = 0;
        for(;j<MAX_COL;j++)
        {
            maze->map[i][j] = map[i][j];
        }
    }
    return;
}

void mazeprint(maze *maze)
{
    if(maze == NULL)
    {
        return;
    }
    size_t i = 0;
    for(;i<MAX_ROW;i++)
    {
        size_t j = 0;
        for(;j<MAX_COL;j++)
        {
            printf("%2d",maze->map[i][j]);
        }
        printf("\n");
    }
}

int canstay(maze *maze,point cur)
{
   if(cur.row < 0 ||cur.row > MAX_ROW || cur.col < 0 ||cur.col >MAX_COL) 
   {
       return 0;
   }
   if(maze->map[cur.row][cur.col] == 1)
   {
       return 1;
   }
   return 0;
}
void mark(maze *maze,point cur)
{
    maze->map[cur.row][cur.col] = 2;
    return;
}
int isexit(maze *maze,point cur,point entry)
{
    if(cur.row == entry.row &&cur.col == entry.col)
    {
        //说明检测的当前点就是入口点
        return 0;
    }
    if(cur.row == 0 || cur.row == MAX_ROW-1 || cur.col == 0 || cur.col == MAX_COL-1)
    {
        return 1;
    }
    return 0;
}

void _getpash(maze *maze,point cur,point entry,seqstack *cur_pash,seqstack *short_pash)
{
    printf("cur:(%d,%d)\n",cur.row,cur.col);
    if(!canstay(maze,cur))
    {
        return;
    }
    mark(maze,cur);
    seqstack_pushback(cur_pash,cur);
    if(isexit(maze,cur,entry))
    {
        printf("找到一条出口\n");
        return;
    }
    point up = cur;
    up.row -= 1;
    _getpash(maze,up,entry);

    point right = cur;
    right.col += 1;
    _getpash(maze,up,entry);

    point down = cur;
    down.row += 1;
    _getpash(maze,up,entry);

    point left = cur;
    left.col -= 1;
    _getpash(maze,up,entry);

}

void getpath(maze *maze,point entry)
{
    if(maze == NULL)
    {
        return;
    }
    _getpash(maze,entry,entry);
}
test函数

void test_maze()
{
    maze maze;
    mazeinit(&maze);
    point entry = {0,1};
    getpath(&maze,entry);
    mazeprint(&maze);

}
int main()
{
    test_maze();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mignatian/article/details/80345014