迷宫求解

问题初始条件: 给定一副地图,一个开始坐标,一个结束坐标,寻找一条可以从开始坐标到结束坐标的路径

问题分析: 可以用栈存储路径的坐标且坐标应有横纵两个属性来对应迷宫二维数组中的位置,此外还需要一个属性来确定方向下一个走到的路径的坐标,定义坐标结构体如下:

typedef struct {int row;int col;int walk;//判断方向
}PosType;

问题关键: 如何走迷宫,首先不能走自己已经走过的路,其次不能走地图中不可走的路,当排除这两个条件后在判断这个点剩下可以走的路将该点压入栈,如果走到最后但并没有到达终点说明进入了一个死胡同,则将该点弹出并标记为不可走的点,然后判断上一个点是否可走,以此继续,总结如下

  • 判断该点是否可走
  • 该点走的下一个方向是哪里
  • 走到该点,继续判断
  • 如果出现死路
    • 将该点标记为不可走并弹出
    • 判断目前栈顶元素的点循环上一过程
void mazePath(PosType start, PosType end) {PosType temp = start;SqStack s;InitStack(s);while (true) {if (temp.col == end.col && temp.row == end.row){Push(s, temp);PrintRoad(s);//打印栈内元素坐标即路径坐标break;}temp.walk=IsCanPass(temp);//判断应该走的方向if (temp.walk!=0){mazenum[temp.row][temp.col] = 0;//走完该点后将该点设置为不可走Push(s,temp);temp = walk_to_next(temp, temp.walk);//按照方向走到该点}else {mazenum[temp.row][temp.col] = 0;//判断该点为死路则标记为不可走pop(s, temp);//弹出走到该点的点mazenum[temp.row][temp.col] = 1;//将该点标记为可以走,继续寻找}}
}

完整代码如下:

#include<stdio.h>
#include<malloc.h>
int mazenum[6][6]= {
{0,1,0,0,0,0},
{0,1,1,1,1,0},
{0,1,0,1,0,0},
{0,1,0,1,1,0},
{0,1,1,0,1,0},
{0,0,1,1,1,0} };
int len = 6;typedef struct {int row;int col;int walk;//判断方向
}PosType;typedef struct {PosType* base;  //栈底指针PosType* top;   //栈顶指针int     stacksize;
} SqStack;PosType maze[6][6];
#define STACK_INIT_SIZE 100;     //存储空间初始分配量
#define STACKINCREMENT 10;     //存储空间分配增量
void InitStack(SqStack& s) {s.base = (PosType*)malloc(100*sizeof(PosType));s.top = s.base;s.stacksize = 100;
}
void Push(SqStack& s, PosType&e) {if (s.top - s.base >= s.stacksize) {s.base = (PosType*)realloc(s.base, (100 + 10) * sizeof(PosType));s.stacksize += 10;s.top = s.base + s.stacksize;}*s.top = e;s.top++;
}
void pop(SqStack& s, PosType& e) {if (s.top == s.base) {printf("栈为空!\n");}else{e = *--s.top;}
}
PosType getTop(SqStack &s,PosType &p) {p = *(s.top - 1);return p;
}
int IsCanPass(PosType &p) {if (mazenum[p.row ][p.col+1]&&p.col+1<len){return 1;}else if (mazenum[p.row+1][p.col]&&p.row+1<len){return 2;}else if (mazenum[p.row ][p.col-1]&&p.col-1>0){return 3;}else if (mazenum[p.row-1][p.col]&&p.row-1>0){return 4;}else{return 0;}}
PosType walk_to_next(PosType p, int di) {if (di==1){p.col++;}else if (di == 2) {p.row++;}else if (di == 3) {p.col--;}else if (di == 4) {p.row--;}else{printf("方向有误!");}return p;
}
void PrintRoad(SqStack s) {while (s.base != s.top) {s.top--;printf("(%d,%d)", s.top->row, s.top->col);}}
void mazePath(PosType start, PosType end) {PosType temp = start;SqStack s;InitStack(s);while (true) {if (temp.col == end.col && temp.row == end.row){//printf("找到了");Push(s, temp);PrintRoad(s);break;}temp.walk=IsCanPass(temp);if (temp.walk!=0){mazenum[temp.row][temp.col] = 0;Push(s,temp);//printf("(%d,%d)", temp.row, temp.col);temp = walk_to_next(temp, temp.walk);}else {mazenum[temp.row][temp.col] = 0;pop(s, temp);mazenum[temp.row][temp.col] = 1;}}
}void createMaze() {for (int i = 0; i < 6; i++){for (int j = 0; j < 6; j++) {//maze[i][j].Canpass = mazenum[i][j];maze[i][j].col = j;maze[i][j].row = i;}}
}void printMaze() {for (int i = 0; i < 6; i++){for (int j = 0; j < 6; j++) {printf("%d ", mazenum[i][j]);}printf("\n");}
}void main() {createMaze();printMaze();PosType start, end;start.row = 0;start.col = 1;end.row = 5;end.col = 2;mazePath(start, end);}

迷宫求解(深度优先)相关推荐

  1. 迷宫问题 深度优先搜索【c++】

    文章目录: 一.问题描述 二.结果展示 三.求解思路 1.题目分析 2.找到迷宫的所有解--左/右手法则 3.解决回路问题 四.详细设计 1.数据结构设计 2.算法设计 五.问题与反思 六.作者的碎碎 ...

  2. 《数据结构实践》设计报告---迷宫求解

    <数据结构实践>设计报告-迷宫求解 因为学校要求答辩结课,给了很多题目都不太会,决定把感兴趣的都做一做,在这存档备用. 课程设计题目:迷宫求解 课程设计主要内容和要求: 一.设计目的: 1 ...

  3. java使用链栈实现迷宫求解

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...

  4. c++:栈的基本操作+实例:迷宫求解

    栈的基本操作+实例:迷宫求解 #include<iostream> using namespace std;struct Node {int datai;int dataj;Node* n ...

  5. 迷宫求解无敌版(递归调用法)

    测试代码: 1   0   0   0   0   0   1   0   0   1   1   0   0   0   1   0   0   0   1   0   1   0   1   0 ...

  6. 强化学习 求解迷宫问题_使用天真强化学习的迷宫求解器

    强化学习 求解迷宫问题 This is a short maze solver game I wrote from scratch in python (in under 260 lines) usi ...

  7. c语言迷宫问题输出坐标,C语言数据结构之迷宫求解问题

    现在网上各种对于迷宫的求解,版本多的数不胜数.本人小白一枚,贴上自己对迷宫的求解这个小项目,自己写的.望能帮助一些同样有困难的人,毕竟我当时费解了好一会儿时间呢. 首先,先标明对于迷宫求解这个项目,首 ...

  8. 栈-迷宫求解路径问题

    //迷宫问题,暴力求解#include"stdio.h"#include"Stack.c"#define MAX_SIZE 100 //迷宫最大规格是100x1 ...

  9. 数据结构迷宫代码_数据结构课程设计——迷宫求解(二)

    前言 接上文的介绍,本文将主要介绍如何生成随机迷宫,在网上找到的资源也比较多,这里我选取了随机 Prim 算法生成迷宫,选择这个算法的理由如下: 算法思想简单,易于实现 生成的迷宫比较自然,不会出现明 ...

最新文章

  1. 计算机软件硬件试讲,试讲:初识计算机网络
  2. 多用户使用一台计算机可设置,2012年职称计算机考试WindowsXP选择题5
  3. JVM调优: 转载JVM调优总结
  4. Windows XP 系统 使用笔记一
  5. [html] HTML5中新添加的表单属性有哪些?
  6. shell脚本while read line的使用
  7. 一位工作了10年的C++程序员总结出这些忠告
  8. CentOS7 基于http服务搭建本地yum仓库
  9. (原創) Verilog入門書推薦2:數位系統實習 Quartus II (SOC) (Verilog)
  10. 【图神经网络】从源头探讨 GCN 的行文思路
  11. 【php】 布尔值判断
  12. 求助!妹子一个rm -rf把公司服务器数据删没了,我该怎么办
  13. 算法:找出相同字母组成的字符串Group Anagrams
  14. 快速突破面试算法之字符串表篇
  15. STATA软件进行meta分析,在界面显示meta分析
  16. 一款牛逼的Android端身份证合成工具
  17. 基于 WebGL 的 3D Chart 图表
  18. CryptoNight
  19. LTE CA下的频点计算
  20. 近期基金有所上涨,你的基金回本了吗?如果回本了,你还会继续持仓吗?

热门文章

  1. 预测分子的化学性质和化学反应
  2. Mysql数据库备份恢复
  3. Numpy攻略系列:repeat函数
  4. 红旗 linux 在哪儿 看 版本,简介红旗Linux不同版本的介绍
  5. bbr是什么?有什么用?如何安装使用?
  6. 基于python的马尔科夫链在股价预测中的应用(基于Tushare)
  7. (转)OLAP和多维数据模型
  8. stp实验心得_STP 实验
  9. IPTV系统云桌面管理:开机广告+三方apk管理+图文介绍
  10. 欧美IT外包的几种业务模式