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

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

首先,先标明对于迷宫求解这个项目,首先我提出自己的思路,利用“穷举求解”的方法(严蔚敏老师数据结构一书中提到,一开始不知方法其名。)其实简单来说就是一条路一条路去试,当然不能随便试,我的方法是按照从入口出发,顺一个方向向前探索,走得通就继续向前走;否则留下标记沿原路退回并换一个方向继续探索,直到所有的路都走完为止。还是用栈的先进后出的结构保存一路的路线。代码用到了栈的顺序实现数组格式的结构(对于栈并没有详细阐述)。

//调用头文件

#ifndef AFXSTD_H

#define AFXSTD_H

#include

#include

#include

#include

using namespace std;

// cout; cin;C++的输入输出

#endif

//迷宫的结构体的创建

#ifndef MAZE_H

#define MAZE_H

#define ROWSIZE 10 //迷宫大小

#define COLSIZE 10

#define Reachable 0 //可以到达的结点

#define Bar 1 //障碍物

#define Foot 2 //足迹

#define Mark 3 //不可通路标记

typedef int MapType[ROWSIZE][COLSIZE]; // 地图类型

typedef struct

{

int row;// x

int col;// y;

}PosType; //坐标结构体

typedef struct

{

int ord; //通道块在道路上的序号

PosType seat; //小人坐标

int di; // 方向 // 1 2 3 4

}MElemType; //试迷宫小人的结构

typedef MElemType SElemType; // 和stack 关联

bool MazePass(MapType maze,PosType curpos);

void FootPrint(MapType maze,PosType curpos); //足迹打印

PosType NextPos(PosType curpos,int di); //下一个位置

void MarkPrint(MapType maze,PosType curpos); //打印不可通标记

bool MazePath(MapType maze,PosType start,PosType end); //迷宫解谜核心

void PrintMap(MapType maze); //打印地图

#endif

//栈的结构体

#include"Maze.h"

#ifndef SEQSTACK_H

#define SEQSTACK_H

#define STACKSIZE 100

//typedef int SElemType;

struct SeqStack

{

SElemType *data;

int maxsize;

int top;

};

void Init_Stack(SeqStack &st);

void Destroy_Stack(SeqStack &st);

void Stack_Clear(SeqStack &st);

bool Stack_Empty(SeqStack &st);

bool Stack_Full(SeqStack &st);

int Stack_Size(SeqStack &st);

bool Stack_Push(SeqStack &st,const SElemType &x);

bool Stack_Pop(SeqStack &st, SElemType &x);

SElemType GetTop(SeqStack &st);

void Pop(SeqStack &st);

#endif

以上是头文件的创建,和结构体的创建,现在真的深切感到结构体的重要性。结构体创建不好就是自己给自己挖坑,切记切记!!

现在贴出函数的代码,解释我会尽力都写清楚。(栈的问题我后续会重新再仔细阐述的,这次的重点在于迷宫的求解,所以直接贴出栈的详细代码,望谅解。)

//这里是栈的实现代码

#include"AfxStd.h"

#include"Stack.h"

bool Stack_Resize(SeqStack &st)

{

SElemType *s = (SElemType*)malloc(sizeof(SElemType)*st.maxsize * 2);

if(NULL == s) return false;

for(int i = 0;i<= st.top;++i)

{

s[i] = st.data[i];

}

free(st.data);

st.data = s;

st.maxsize = st.maxsize * 2;

return true;

}

void Init_Stack(SeqStack &st)

{

st.maxsize = STACKSIZE;

st.top = -1;

st.data = (SElemType*)malloc(sizeof(SElemType)*st.maxsize);

if(NULL == st.data)

{

exit(0);

}

}

void Destroy_Stack(SeqStack &st)

{

free(st.data);

st.data = NULL;

st.maxsize = 0;

st.top = -1;

}

void Stack_Clear(SeqStack &st)

{

st.top = -1;

}

bool Stack_Empty(SeqStack &st)

{

return Stack_Size(st) == 0;

}

bool Stack_Full(SeqStack &st)

{

return Stack_Size(st) == st.maxsize;

}

int Stack_Size(SeqStack &st)

{

return st.top + 1;

}

bool Stack_Push(SeqStack &st,const SElemType &x)

{

if(Stack_Full(st) && ! Stack_Resize(st))

{

return false;

}

st.data[++st.top] = x;

return true;

}

bool Stack_Pop(SeqStack &st, SElemType &x)

{

if(Stack_Empty(st))

{

return false;

}

x = st.data[st.top--];

return true;

}

//调用前面创建的头文件

#include"AfxStd.h"

#include"Maze.h"

#include"Stack.h"

/

bool MazePass(MapType maze,PosType curpos) //判断是否可以通过

{

return maze[curpos.row][curpos.col] == Reachable; //判断当前结点是否能通过

}

void FootPrint(MapType maze,PosType curpos) //打印足迹

{

maze[curpos.row][curpos.col] = Foot;

}

PosType NextPos(PosType curpos,int di) //对下一个结点方向的判断

{

switch(di)

{

case 1: curpos.row+=1; break;// 1

case 2: curpos.col-=1; break;// 2

case 3: curpos.row-=1; break;// 3

case 4: curpos.col+=1; break;// 4

}

return curpos;

}

void MarkPrint(MapType maze,PosType curpos) //不能通过的结点留下不能通过的标记

{

maze[curpos.row][curpos.col] = Mark;

}

bool MazePath(MapType maze,PosType start,PosType end)//(核心)迷宫解谜

{

bool res = false; //定义一个res参数为布尔型

PosType curpos = start; //初始当前位置为入口

int curstep = 1; // 初始探索方向为1

SeqStack st; //路径存储栈

MElemType e; //初始探索小人

Init_Stack(st); //初始化栈

do{

if(MazePass(maze,curpos)) //当前位置可通过,即是未曾走到过的坐标

{

FootPrint(maze,curpos); //留下足迹

e.di = 1, e.seat = curpos,e.ord = curstep++;

Stack_Push(st,e); //加入路径中

if(curpos.row == end.row && curpos.col == end.col)

{

res = true;

break;

} //到达终点

curpos = NextPos(curpos,1); //探索下一位置

}

else

{

if(!Stack_Empty(st)) //当前位置不能通过

{

Stack_Pop(st,e);

while(e.di == 4 && !Stack_Empty(st))

{

MarkPrint(maze,e.seat);

Stack_Pop(st,e); // 留下不能通过的标记,并退回一步

}

if(e.di < 4)

{

e.di+=1; // 换下一个方向探索

Stack_Push(st,e); //再次记录路径

curpos = NextPos(e.seat,e.di); // 当前位置设为新方向的相邻块

}

}

}

}while(!Stack_Empty(st)); //当栈空摧毁栈,返回失败参数

Destroy_Stack(st);

return res;

}

void PrintMap(MapType maze) //打印地图

{

for(int i = 0;i

{

for(int j = 0;j

{

printf("%2d",maze[i][j]);

}

printf("\n");

}

printf("\n");

}

以上就是迷宫的详细解释,希望能帮助到大家。后面再添加我的测试文件。

#include"AfxStd.h"

#include"Maze.h"

int main()

{

MapType maze ={ //一开始地图的创建

{1,1,1,1,1,1,1,1,1,1},

{1,0,1,1,1,1,1,1,1,1},

{1,0,0,0,0,0,0,0,0,1},

{1,0,0,0,1,1,1,1,0,1},

{1,0,0,0,1,1,1,1,0,1},

{1,0,1,1,1,1,0,0,0,1},

{1,0,1,1,1,1,1,1,1,1},

{1,0,0,0,0,0,0,1,1,1},

{1,0,1,1,1,1,0,0,0,1},

{1,1,1,1,1,1,1,1,1,1},

};

PosType start={1,1},end={8,8};

PrintMap(maze); //打印初始地图

MazePath(maze,start,end);

PrintMap(maze); //打印迷宫解法

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Html5——File、FileReader、Blob、Fromdata对象

www.cnblogs.com/fps2tao/p/9… 转自上面 File File 接口提供有关文件的信息&#xff0c;并允许网页中的JavaScript访问其内容。 File对象可以用来获取某个文件的信息&#xff0c;还可以用来读取这个文件的内容。通常情况下&#xff0c;File对象是来自用户在一个 <input>…

中小企业信息化及市场

中小企业信息化及市场中小企业信息化是被各界高度关注的领域&#xff0c;近日在中国信息产业经济年会上听到了中小企业司刘怡的报告。中小企业信息化的现状是&#xff1a;61&#xff05;的中小企业已有专职的信息化建设与运行部门&#xff0c;但配置的IT专业技术人员少。可熟练…

linux 修改ldap密码,Linux-ldap密码修改程序,如何加密ssha

LDAP中SHA,SSHA,MD5加密方法经过了特殊处理SHA加密方法&#xff1a;/*** SHA加密* param $password 需要加密的字符串* return 返回加密号的字符串* */public function ldap_sha($password){$ldap_passwd "{SHA}".base64_encode(pack("H*", sha1($passwor…

tinyxml c语言,开源TinyXML 最简单的新手教程

TinyXML它是基于一个非常受欢迎的现在DOM型号XML解析器&#xff0c;简单易用且小巧玲珑&#xff0c;很适合存储简单数据。配置文件。当前最新版本号是2.6.2先看一下源代码文档的结构&#xff1a;Docs是帮助文档。里边有许多的使用说明&#xff0c;只截一张图看一下&#xff1a;…

c语言程序设计教程本科,新编C语言程序设计教程(本科)第5篇.pdf

第5章选择结构程序设计第5章选择结构程序设计5.1 if语句5.2 switch语句5.3 goto语句5.4 程序设计举例第5章选择结构程序设计5.1 if语句5.1.1 单分支if语句格式: if (条件表达式)语句功能: 先计算条件表达式的值, 如果条件表达式的值为真(非0 ), 执行语句(选择体), 否则执行if语…

真的要去美国吗?

[url]http://finance.sina.com.cn[/url] 2006年07月12日 16:39 《市场圈》虽然这两年“海龟”和“海带”的话题已经不再成为媒体关心的焦点&#xff0c;但是关于MBA的讨论似乎更加白热化。我曾经也认真地问过自己,“真的值吗&#xff1f;”文&#xff5c;寨克1999年8月26日&…

C#开发高亮语法编辑器(一)——TextBox ,RichTextBox

C#简单实现高亮语法编辑器(一)——TextBox ,RichTextBox的局限性一、RichTextBox基本设置二、实现语法高亮三、关键字提示四、实现行号就简单快速得开发文本编辑器TextBox 最为简单&#xff0c;大家用得也多&#xff0c;缺点是无法实现复杂的操作。RichTextBox虽然是则功能比它…

c语言即时通讯软件源码,即时通讯软件源码-基于c语言即时通讯软件代码实现

我不知道哪种语言无关紧要。开源&#xff0c;我不知道该用什么。即时通讯软件源代码为JAVA语言对于即时通讯软件源代码最好是用C语言编写的&#xff0c;想学一下&#xff0c;感谢您即时通讯软件有什么。includewinscock2、h#includewinscock2、h#includesting。h#includewindow…

介绍一款资料管理软件EverNote

原来一直用OneNote来做资料收集。资料收集软件很重要的一点就是需要的时候要能很容易地找到所需资料。OneNote是通过[笔记本]>[工作区]>[页]的严格层次结构来管理资料&#xff0c;有个假定就是资料是可以纳入一个树状系统并且各个节点之间没有交叉。但这个明显是有问题的…

蒙特卡洛法求圆周率 c语言,c++蒙特卡洛法求圆周率

在linux下用 g pi.cpp -o pi -lm 编译。//蒙特卡洛法求圆周率#include #include #include #include using namespace std;double FindPi(const long n){srand(time(NULL));long sum 0;double x 0.0, y 0.0;for (long i 0; i < n; i){x (double)(rand())/(double)RAND_M…

Dvbbs 7.1论坛鼠标指针修改方法

http://www.jfeng.cn/1.请登陆后台,进入风格界面设置里 - 当前模板CSS设置(Forum_CSS)2.在BODY{.........}里面加入: CURSOR: url(skins/xx.ani)3.完成.

android 引用非 android 工程,Unity3D调用android方法(非插件方式)

关于Unity3D工程与android工程的转换与合并&#xff0c;请参考我的另外一篇博客&#xff0c;如果你对Unity3D工程加入到android工程的过程不熟悉&#xff0c;也请先看完下面这篇博客&#xff1a; android与Unity3D交互&#xff0c;fragment显示unity3d视图。 下面&#xff0c;我…

探讨继承与实现(二)

前文 探讨继承与实现&#xff08;一&#xff09; 根据双鱼座的提示已经更新。很不巧&#xff0c;我也是双鱼座的。由于水平有限&#xff0c;有什么不足还请大家指教。2007年2月1日 http://www.cnblogs.com/birdshover/目录&#xff1a;一、抽象的产生二、依赖抽象三、抽象的损…

实现android应用程序自动化测试的批处理脚本,简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本...

一、前言好久没写帖子&#xff0c;去年晋升为 leader 之后工作比较忙&#xff0c;去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试&#xff0c;到今天为止跑了将近半年&#xff0c;前期感觉还行&#xff0c;但随着用例的增加&#xff0c;执行自动化脚本的时间…

祝大家新年快乐

祝大家新年快乐!万事如意!衷心祝愿大家在新的一年里&#xff1a;所有的期待都能出现&#xff01; 所有的梦想都能实现!所有的希望都能如愿!所有的努力都能成功! 感谢大家一直以来对博客园的支持与帮助!转载于:https://www.cnblogs.com/dudu/archive/2007/02/17/652131.html

android 重新启动应用程序,在AsyncTask完成后重新启动完整的Android应用程序

我编码的应用程序检查/ sdcard下的目录中是否有特殊的ZIP文件,如果没有,则开始下载并解压缩.即使是子目录,下载和解压缩也可以工作.但是我需要在完成后重新启动应用程序 – 这不起作用.起初我有一个特殊的活动“PreMainActivity.java”只是为了重新启动目的&#xff1a;import …

Castle学习之一:安装与环境设置

第一步&#xff0c;当然是下载了。我本来下载的是Castle RC2的MSI安装文件&#xff0c;并通过SVN下载了Generator&#xff0c;但是安装后发现了一些问题&#xff08;主要是.net版本的问题&#xff09;&#xff0c;所以删除了之后&#xff0c;从SVN下载了全部最新的代码&#xf…

android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

前言想在锁屏上面实现弹窗&#xff0c;第一个想法就是利用 WindowManager设置 Window的 Flag&#xff0c;通过设置 Flag的显示优先级来让窗口显示在锁屏的上面。接下来就是试验可能相关的 Window Type属性&#xff0c;验证该方案是否可行。在尝试各个 Window Type 属性之前需要…

C# 调用 *.sql 文件

源&#xff1a;http://zhidao.baidu.com/question/5367984.html?si2using System; using System.Xml; using System.Data; using System.IO; using System.Collections; using System.Data.SqlClient; namespace ExecuteSqlFile { /// <summary> /// DBAccess 的摘要说明…

next按钮源码android,Android Edittext 软键盘输入法回车键改成下一步Next

软件盘中回车键默认功能是换行&#xff0c;但是有时候我们在Edittext中输完内容后点回车想要把焦点切到下一个Edittext继续输入&#xff0c;比如常见的登录页面&#xff0c;在输完用户名后&#xff0c;点回车调到输入密码输入框继续输入。示例代码代码很简单&#xff0c;如下所…