路障

路障

路障

路障

路障

路障

路障

 入口

路障

路障

路障

路障

路障

路障

路障

路障

路障

路障

出口

路障

路障

路障

路障

路障

路障

路障

如上图,,要求输出迷宫的所有路径,并求出最短路径长度及最短路径。。。。。。

入口坐标设为(1,1),出口坐标设为(4,4),,,亲,,,接下来你懂的。。。。。

#include<stdio.h>

#define M 4    //行数
#define N 4     //列数
#define MaxSize    100     //栈最多元素个数
int mg[M+2][N+2]={      //一个迷宫,其四周要加上均为1的外框
    {1,1,1,1,1,1},
    {1,0,0,0,1,1},
    {1,0,1,0,0,1},
    {1,0,0,0,1,1},
    {1,1,0,0,0,1},
    {1,1,1,1,1,1}
};

struct migong{
    int i;      //路径横坐标
    int j;      //路径纵坐标
    int di;     //方向
}Stack[MaxSize],Path[MaxSize];      //定义栈和存放最短路径的数组

int top=-1;     //栈顶指针
int count=1;    //路径数计数
int minlen=MaxSize;     //最短路径长度

void mgpath(){      //路径为:(1,1)->(M,N)
    int i,j,di,find,k;
    top++;Stack[top].i=1;Stack[top].j=1;Stack[top].di=-1;
    mg[1][1]=-1;        //初始结点进栈
    while(top>-1){      //栈不空时循环
        i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
        if(i==M && j==N){       //找到了出口,输出路径
            printf("M:  ",count++);
            for(k=0;k<=top;k++){
                printf("(%d,%d)  ",Stack[k],i,Stack[k].j);
                if((k+1)%5==0)      //输出时每5个结点换一行
                    printf("\n\t");
            }
            printf("\n");
            if(top+1<minlen){       //比较输出最短路径
                for(k=0;k<=top;k++)
                    Path[k]=Stack[k];
                minlen=top+1;
            }
            mg[Stack[top].i][Stack[top].j]=0;   //让该位置变为其他路径的可走结点
            top--;
            i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
        }
        find=0;
        while(di<4 && find==0){     //找下一个可走结点
            di++;
            switch(di){
                case 0:i=Stack[top].i-1;j=Stack[top].j;break;   //上面
                case 1:i=Stack[top].i;j=Stack[top].j+1;break;   //右边
                case 2:i=Stack[top].i+1;j=Stack[top].j;break;   //下面
                case 3:i=Stack[top].i;j=Stack[top].j-1;break;   //左边
            }
            if(mg[i][j]==0)
                find=1;
        }

if(find == 1){      //找到了下一个可走结点
            Stack[top].di=di;   //修改原栈顶元素的di值
            top++;      //下一个可走结点进栈
            Stack[top].i=i;
            Stack[top].j=j;
            Stack[top].di=-1;
            mg[i][j]=-1;        //避免重复走到该结点
        }else{
            mg[Stack[top].i][Stack[top].j]=0;   //让该位置变为其他路径的可走结点
            top--;
        }
    }

printf("最短路径如下:\n");
    printf("长度:  %d\n",minlen);
    printf("路径:  ");
    for(k=0;k<minlen;k++){
        printf("(%d,%d)  ",Path[k].i,Path[k].j);
        if((k+1)%5==0)      //输出时每5个结点换一行
            printf("\n\t");
    }
    printf("\n");
}

int main(){
    printf("迷宫所有路径如下:\n");
    mgpath();
    return 0;
}

求解迷宫问题的所有路径及最短路径程序相关推荐

  1. python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序

    目的:能将栈运用的更为熟练 实验内容:求解迷宫问题程序,要求输出如图所示的迷宫的路径,并求出第一条最短路径的长度以及最短路径. 设计的算法功能: mgpath(int xi,int yi,int xe ...

  2. 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)

    // algo3-11.cpp 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径) #include"c1.h" #include"func3-1.cpp" ...

  3. C++ 迷宫问题 多条路径 所有路径 最短路径 课程设计

    为期一周的数据结构课程设计中写了一个迷宫问题的C++程序,虽然迷宫问题的程序已经很多人贴出来过了,程序也非常地简单,但是只要查过一遍就能发现大多数都是简单的深度优先搜索求一条路径,或者是广度优先搜索遍 ...

  4. 7-7 求解迷宫从入口到出口的路径 (15 分) java

    求解迷宫从入口到出口的路径.输入一个迷宫,求从入口通向出口的可行路径.为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运 ...

  5. 蛮力法 —— 求解迷宫问题 —— DFS和BFS

    求解迷宫问题 问题描述: 有如图8×8的迷宫 OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOOOOXOO XXXXXXXO 其中,O表示通路方块,X表示 ...

  6. A*算法求解迷宫问题(算法讲解与证明、python实现与可视化)

    目录 一.引入 二.具体细节 1.BFS(Breadth First Search) 2.Dijkstra(Uniform Cost Search) 3.启发式(Heuristic search) 4 ...

  7. 栈、队列和数组(包括求解迷宫问题)

    1.1 琐碎知识点 栈.队列.数组是线性存储结构,它们都是一段连续的内存空间,其中栈和队列是动态的,而数组是静态的.它们的区别在于: 栈:后进先出,只能在栈顶进行插入和删除操作. 队列:先进先出,只能 ...

  8. 图求解迷宫问题(对比队列)

    大家好,今天我分享的是用图求解迷宫问题.我们知道用栈和递归求解出的路径并不是最简的路径,队列求解出的路径是最短路径,而图求解出的迷宫路径是怎样的呢? 目录如下可快速查阅 算法描述 用二维数组定义迷宫 ...

  9. 栈和队列求解迷宫问题(数据结构学习笔记)

    文章目录 迷宫问题 "栈"求解迷宫问题 行走规则 算法思路 算法代码 栈的定义 算法设计 完整代码 最终迷宫路径 算法总结 "队列"求解迷宫问题 算法思路 算法 ...

最新文章

  1. AngularJS学习笔记(3)——通过Ajax获取JSON数据
  2. 使用Synchronized块同步方法
  3. java oracle database user dsn_跨会话序列化数据库连接
  4. 如何使用JavaScript或JQuery检测一个URL文件是否存在?
  5. 带父节点的平衡二叉树_Python算法系列—深度优先遍历算法【二叉树】
  6. Gtk的entry传递数据到内部程序
  7. 昂达v811v1 刷4.22d
  8. 推荐10个国外的开源免费的.NET CMS系统
  9. 交换机、路由器和防火墙的原理和区别
  10. 修改基于formView的MFC单文档背景颜色
  11. cufflinks修改使用
  12. serialize()序列化
  13. 卫星图瓦片爬取之google卫星图偏移的问题
  14. 《数据结构》八大排序(详细图文分析讲解)
  15. 学C语言和英语水平的关系顶多不过半毛
  16. 保卫城市消费券安全,从这些做起
  17. 基于 vue.js 的仿QQ聊天室
  18. 思一独角兽好朋友群活动回顾——IBCA国际区块链与数字货币协会
  19. GDOI2020退役记
  20. CSS实现行高是字号的1.5倍

热门文章

  1. 【Android 逆向】Android 系统文件分析 ( 根目录下的目录和文件 | /data/ 应用和用户数据目录 | /mnt/ 挂载其它设备目录 )
  2. 【Android 文件管理】分区存储 ( 修改与删除图片文件 )
  3. springboot 常用的异常处理方式
  4. js、jquery、h5、css等简记
  5. MyAdapter Andriod
  6. phpstudy composer 安装YII2
  7. JNI中java类型的简写
  8. es6-let 和 const
  9. Java_Web使用简单的批处理操作
  10. MySQL 清理slowlog方法