找迷宫最短路径

深度优先搜索

典型问题:找迷宫最短路径

一,不输入迷宫的数据 

#include<stdio.h>
//因为有很多变量全局都要使用,所以采用定义全局变量
int n,m,p,q,sx,sy,min=9999999,t,i;//这是迷宫的长和宽,想要到达的终点坐标和起点坐标。t为障碍的个数
//这个min之所以要大一点,是因为他要装最短路径,不能赋0为初值。
int next[4][2]={{1,0},{0,-1},{-1,0},{0,1}};//这个是等会移动时要加的值,依次表示向右上左下移动
int a[1000][1000]={0};//这个表示迷宫,0表示无障碍,1表示有障碍。
int v[1000][1000]={0};//这个表示有无访问过这个格子,0表示已访问,1表示未访问。
int T[1000][2]={0};//装障碍的地址。
//核心代码
void dfs(int x,int y,int step)
{
    int tx,ty,i;
    //下面的if判断是判断有无到达终点,至于为什么在开头等会就知道了
    if(x==p&&y==q)
    {
         if(step<min)
         {
             min=step;         
         }
         return;            
    }
    //用一个循环来分别实现右下上左的移动
    for(i=0;i<4;i++)
    {
        //用tx,ty来装移动后的位置
        tx=x+next[i][0];
        ty=y+next[i][1];
        //判断所到达格子是否越界(也就是不在n*m的范围里),********不能忘了这行****************
        if(tx<1||tx>m||ty<1||ty>n)
        {
            continue;        
        }
        //判断所移动到的格子是否被访问过和是否有障碍,如果都有就用dfs进行下次移动
        if(a[tx][ty]==0&&v[tx][ty]==0)
        {
            //将v中的这个格子赋值为1,表示已访问
            v[tx][ty]=1;
            dfs(tx,ty,step+1);
            //防止影响其他路线的行走,再赋值回0,相当于 v[tx][ty]=1;只在上行的dfs中起作用
            v[tx][ty]=0;                   
        }                
    }
    //所有情况判断完了,就return。
    return;
}
int main (void)
{
    //输入迷宫的长和宽和障碍的数目。
    scanf("%d%d%d",&n,&m,&t);
    //输入迷宫的起点和终点
    scanf("%d%d%d%d",&sx,&sy,&p,&q);
    //输入障碍的坐标
    for(i=0;i<t;i++)
    {
        scanf("%d%d",&T[i][0],&T[i][1]);    
    }
    //将数据转进迷宫中
    for(i=0;i<t;i++)
    {
        a[T[i][0]][T[i][1]]=1;    
    }
    //深度搜索模式,启动!!!
    dfs(sx,sy,0);
    //输出结果
    printf("%d",min);
    return 0;
}

二,要输入迷宫数据

其实和上面差不多

就是主函数内多一个嵌套循环来输入

#include<stdio.h>
int n,m,p,q,min=999999999;
int next[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
int a[1000][1000]={0};
int v[1000][1000]={0};
void dfs(int x,int y,int step)
{
    int tx,ty,i;
    if(x==p&&y==q)
    {
        if(step<min)
        {
            min=step;
        }
    }
    for(i=0;i<4;i++)
    {
        tx=x+next[i][0];
        ty=y+next[i][1];
    if(tx<1||tx>n||ty<1||ty>m)
    {
        continue;
    }
    if(a[tx][ty]==0&&v[tx][ty]==0)
    {
        v[tx][ty]=1;
        dfs(tx,ty,step+1);
        v[tx][ty]=0;
    }
    return;
    }
}
int main (void)
{
    int i,k,sx,sy,p,q;
    scanf("%d%d",&n,&m);
 //不用再装障碍物的位置了,直接在这个嵌套循环中输入了
 //而且输入开始不要从0开始,从1开始,非常重要!!!!
    for(i=1;i<=n;i++)
    {
        for(k=1;k<=m;k++)
        {
            scanf("%d",&a[i][k]);
        }
    }
    scanf("%d%d%d%d",&sx,&sy,&p,&q);
    dfs(sx,sy,0);
    printf("%d",min);
    return 0;
}

PS:如果你想要算出一共有几种行走方案,那就需要把起始点赋值成已走过

也就是

v[sx][sy]=1;

这样才能搞出正确的答案

在MATLAB中,解决迷宫中的最短路径问题通常可以使用图论的方法,比如广度优先搜索(Breadth-First Search, BFS)或Dijkstra算法。这两个算法常用于寻两点之间的最短路径。下面是使用BFS的一个基本示例: **使用BFS解决迷宫最短路径:** 1. **创建迷宫矩阵**:首先,你需要将迷宫表示为一个二维数组,0代表可以通行,1代表墙壁。 2. **初始化**:设置起点和终点,定义一个队列来存储节点,并标记起点为已访问。 3. **广度优先遍历**: a. 将起点加入队列。 b. 当队列不为空时,从队首取出一个节点,如果它是终点,则到路径;如果不是,检查其邻居(上下左右)是否可通行且未访问过,可通行则标记为已访问并加入队列。 c. 重复步骤b,直到队列为空或到终点。 4. **路径记录**:在到路径后,可以通过回溯记录下每个节点,从而得到从起点到终点的最短路径。 **使用Dijkstra算法**: Dijkstra算法适合有权重的图,如果你的迷宫有特定的难度值(如距离或代价),你可以用它来寻最低成本的路径。该算法从起点开始,逐步更新到每个节点的最短路径。 **相关问题--:** 1. 如何在MATLAB中表示一个二维迷宫矩阵? 2. Dijkstra算法与BFS相比,在什么情况下更适用? 3. 如果迷宫有复杂规则(如动态变化或随机生成),如何处理? 如果需要具体代码示例,请告诉我,我可以提供一个简化版的MATLAB代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值