DFS求解迷宫问题

问题的提出

       我们通过一个邻接矩阵存储一个迷宫,1代表改处有障碍,无法通行,0代表无障碍可以通行,给出起始点和终点,请给出一条可行路径。

解题思路

       这里我们采取DFS深度优先搜索的方法求解出一条可行路径。

DFS

       深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

具体代码(C)

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<stack>
using namespace std;
 
int record[4][4] = {0};//记录该点是否访问过
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//优先向右下方走
int maze[4][4] = {{0,0,1,0},
                  {1,0,0,1},
                  {0,1,0,0},
                  {1,1,1,0}};
stack <int> s;

int visit(int a,int b)
{
    if(record[a][b] == 0&&maze[a][b] == 0&&a >= 0&&a <= 3&&b >= 0&&b <= 3)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void traverse()
{
    int len = s.size()/2;
    
    int b[15][2];
    for(int i = len;i > 0;i--)
    {
        b[i][1] = s.top();
        s.pop();
        b[i][0] = s.top();
        s.pop();
    }
    
    for(int i = 1;i < len;i++)
    {
        printf("(%d,%d)->",b[i][0],b[i][1]);
    }
    printf("(%d,%d)",b[len][0],b[len][1]);
    printf("已到达终点!");
}
                  
void DFS(int maze[4][4],int start[2],int end[2])
{
    int p[2];
    p[0] = start[0];
    p[1] = start[1];

    record[start[0]][start[1]] = 1;
    
    if(start[0] == end[0]&&start[1] == end[1])
    {
        
        traverse();
        exit(0);
    }
    
    for(int i = 0;i < 4;i++)
    {
        int x,y;
        
        x = start[0] + dir[i][0];
        y = start[1] + dir[i][1];
        
        if(visit(x,y))
        {
            s.push(x);
            s.push(y);
            p[0] = x;
            p[1] = y;
            DFS(maze,p,end);
        }
    }
    s.pop();
    s.pop();
}

int main()
{
    int start[2] = {0,0};
    int end[2] = {3,3};
    
    s.push(start[0]);
    s.push(start[1]);
    DFS(maze,start,end);
    printf("无法到达终点"); 
    return 0;
} 
复制代码

运行结果

 

posted @   嗯嗯魑嗯嗯  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示