文档库 最新最全的文档下载
当前位置:文档库 › 求解迷宫问题(c语言,很详细哦)

求解迷宫问题(c语言,很详细哦)

求解迷宫问题(c语言,很详细哦)
求解迷宫问题(c语言,很详细哦)

求迷宫问题就是求出从入口到出口的路径。在求解时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。

首先用如图所示的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。

为了表示迷宫,设置一个数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,如图所示的迷宫,对应的迷宫数组mg如下:

int mg[M+1][N+1]={ /*M=10,N=10*/

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

{1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; 伪代码:

c语言描述如下:

void mgpath() /*路径为:(1,1)->(M-2,N-2)*/ {

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-2 && j==N-2) /*找到了出口,输出路径*/

{

printf("迷宫路径如下:\n");

for (k=0;k<=top;k++)

{

printf("\t(%d,%d)",Stack[k].i,Stack[ k].j);

if ((k+1)%5==0) printf("\n");

}

printf("\n");

return;

}

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");

}

用c语言实现迷宫求解完美源代码

#include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define UNDERFLOW -2 typedef int Status; //-----栈开始----- typedef struct{//迷宫中r行c列的位置 int r; int c; }PostType;//坐标位置类型 typedef struct{ int ord;// 当前位置在路径上的序号 PostType seat;// 当前坐标 int di;// 从此通块走向下一通块的“方向” }SElemType;// 栈的元素类型 //定义链式栈的存储结构 struct LNode { SElemType data;//数据域 struct LNode *next;//指针域 }; struct LStack { struct LNode *top;//栈顶指针 }; Status InitStack(LStack &s)//操作结果:构造一个空栈S { struct LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) {printf("分配失败,退出程序"); exit(ERROR); } s.top=p; p->next=NULL; return OK; }

Status StackEmpty(LStack s) //若栈s为空栈,则返回TRUE,否则FALSE { if(s.top->next==NULL) return TRUE; return FALSE; } Status Push(LStack &s,SElemType e)//插入元素e成为新的栈顶元素 { struct LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); s.top->data=e; p->next=s.top; s.top=p; return OK; } Status Pop(LStack &s,SElemType &e)//删除s的栈顶元素,并且用e返回其值{ struct LNode *p; if(!(s.top->next)) exit(UNDERFLOW); p=s.top; s.top=p->next; e=s.top->data; free(p); return OK; } Status DestroyStack(LStack &s)//操作结果:栈s被销毁 { struct LNode *p; p=s.top; while(p) { s.top=p->next; free(p); p=s.top; } return OK; } //-----栈结束------ //-----迷宫开始------- #define MAXLEN 10// 迷宫包括外墙最大行列数 typedef struct{ int r;

迷宫求解问题资料

迷宫求解问题 摘要:用矩阵表示迷宫,将矩阵表示的迷宫转换成无向图,用邻接表存储。对无向图从入口结点开始广度优先搜索,用一个一维数组存储各个结点的前驱结点的编号,通过出口结点Vn找到其前驱结点Vn-1,再通过Vn-1找到Vn-2,依次类推直到找到出口结点。 关键字:矩阵迷宫求解 一、需求分析 1.程序题目: 迷宫求解问题。迷宫是一个如下所示的m行n列的0-1矩阵,0表示无障碍,1表示有障碍。设入口为(1,1),出口为(m,n),每次移动只能从一个无障碍的单元移到周围8个方向的任意一个无障碍的单元,编写程序给出一条通过迷宫的路径或者报告一个“无法通过”的信息。 入口->(0,0,0,1,0,0,0,1,0,0,0,1,0,0,1) (0,1,0,0,0,1,0,1,0,0,0,1,1,1,1) (0,1,1,1,1,1,0,1,0,0,1,1,1,0,1)

(1,1,0,0,0,1,1,0,1,1,0,0,1,0,1) (1,0,0,1,0,1,1,1,1,0,1,0,1,0,1) (1,0,1,0,0,1,0,1,0,1,0,1,0,1,0) (1,0,1,1,1,1,1,0,0,1,1,1,1,0,0) (1,1,1,0,1,1,1,1,0,1,0,1,0,1,0) (1,0,1,0,1,0,1,1,1,0,1,0,0,0,1) (0,1,0,1,0,1,0,0,0,1,1,0,0,1,0)->出口 2.程序说明及任务: 迷宫问题要求寻找一条从入口到出口的路径。路径是由一组位置构成的,每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的东、南、西或北的邻居,如图C。 计算机走迷宫的方法是,采取一步一步试探的方法。每一步都从东开始,按顺时针对8个方向进行试探,若某方向上maze(x,y)=0,表示可以通行,则走一步;若maze(x,y)=1,表示不可以通行,须换方向再试,直到8个方向都试过;若maze (x,y)均为1,说明此步已无路可走,需退回一步,在上一步的下一个方向重新开始探测。为此,需设置一个栈,用于记录所走过的位置和方向(i,j,dir)。当退回一步时,从栈中退出一个元素,以便在上一个位置的下一个方向上探测,如又找到一个行进方向,则把当前位置和方向重新进栈,并走到新的位置。

c语言程序设计 迷宫

数据结构课程设计_迷宫问题 /* Name:迷宫 Author:wujilin Description:输入时候一圈都应该是# 入口为(1,1) 如果有出口出口为(M-2,M-2) Date: 16-07-06 20:54 Copyright:wujilin */ #include #include #define M 10 //自己规定为10*10的迷宫 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int findway(int); int NextStep(int *, int *, int ); typedef struct { int x, y; //坐标 int dir; //方向 }ElemType; typedef struct StackNode//构造栈 { ElemType *base; ElemType *top; int stacksize; }SqStack; int InitStack(SqStack *S)//初始化栈 { S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S->base) { printf("memory allocation failed,goodbye"); exit(1); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; }

算法实验报告:罗密欧与朱丽叶迷宫求解

河南科技大学 课程设计报告 课程名称:算法设计与分析 设计题目:罗密欧与朱丽叶迷宫求解问题 院系:电子信息工程学院 专业:计算机科学与技术 班级:计算机092班 学生姓名: 学号:09************ 起止日期: 2011年5月28日 - 2011年6月3日指导教师:孙士保、张明川、冀治航

课程设计题目罗密欧与朱丽叶的迷宫问题 姓名*** 学号091040602** 班级092班系别电子信息工程学院专业计算机科学与技术 组别1人组长*** 组员*** 指导教师姓名孙士保、张明川、冀治航 课程设计目的 进一步巩固C程序设计和算法设计与分析的基础知识,提升结构化程序、模块化程序设计的方法和能力,深入理解数据结构的基本理论,掌握数据存储结构的设计方法,掌握基于数据结构的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。在实践中培养独立分析问题和解决问题的作风和能力。 设计环境1. PC兼容机 2.Windows 2000/XP操作系统3.TC集成开发环境或其他C语言开发环境 课程设计要求和任务要求:1.熟练掌握回溯法,能够利用回溯法解决实际问题; 2.使用文件进行存储和管理。程序启动时可从文件中读取信息,或从键盘输入信息;运行过程中也可对文件进行存取;退出前可选择将部分信息保存 到文件中; 3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。对程序其它部分也进行必要的注释。 4.对系统进行功能模块分析、画出总流程图和各模块流程图; 5.用户界面要求使用方便、简洁明了、美观大方、格式统一。所有功能可以反复使用,最好使用菜单; 6.通过命令行相应选项能直接进入某个相应菜单选项的功能模块; 7.所有程序需调试通过。 任务:完成罗密欧与朱丽叶的迷宫问题.设计内容包括: 1.确定能对给定的任何位置的罗密欧都能够找到一条通向朱丽叶的路线; 2.程序能够演示一条罗密欧找到朱丽叶的路线过程等。 课程设计工作进度计划 序号起止日期工作内容 1 下发任务书,分组,选定课题,查阅相关资料 2 总体设计,划分模块 3 编制源程序 4 上机调试,修改、完善系统 5 程序检查 6 撰写说明书

123迷宫(C语言版)

#include #include #include #define stack_init_size 200 #define stack_increment 10 #define OVERFLOW 0 #define OK 1 #define ERROE 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef struct{ int x; int y; }PosType; typedef struct{ int ord; // 通道块在路径上的“序号” PosType seat; //通道块在迷宫中的“坐标位置” int di; //从此通道块走向下一通道块的“方向” }SElemType; typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack; int mg[20][20]; /*随机生成迷宫的函数 /*为了能够让尽量能通过,将能通过的块和不能通过的块数量比大致为2:1*/ void Random(){ int i,j,k; srand(time(NULL)); mg[1][0]=mg[1][1]=mg[18][19]=0; //将入口、出口设置为“0”即可通过 for(j=0;j<20;j++) mg[0][j]=mg[19][j]=1; /*设置迷宫外围“不可走”,保证只有一个出口和入口*/ for(i=2;i<19;i++) mg[i][0]=mg[i-1][19]=1; /*设置迷宫外围“不可走”,保证只有一个出口和入口*/ for(i=1;i<19;i++)

迷宫问题

算法设计与分析课程设计罗密欧与朱丽叶的迷宫问题设计分析测试报告 程序算法设计说明书

一、前言 1、题目:罗密欧与朱丽叶的迷宫问题。 罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿8 个方向进入未封闭的房间。罗密欧位于迷宫的(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。每改变一次前进方向算作转弯一次。请设计和实现一个算法帮助罗密欧找出这些道路。 2、程序编制环境相关说明 硬件:装有windows操作系统的计算机 软件:Visual C++ 2008

二、程序主要算法设计分析说明 1、算法设计思路 用回溯法解迷宫问题时,用排列树表示其解空间比较合适。可行性约束函数减去不满足约束条件(x,y,z)已越界的子树。在排列树的第i+1层节点z处用board[z][x][y]记载所在的房间。当bool stepok(int x,int y,int z)返回为false时,以z为根的子树中所有子树都不满足约束条件,因而该子树中的解均为不可行解,故可将该子树剪枝。 算法调用递归方法void backtrack(int dep,int x,int y,int di)实现回溯搜索。void backtrack (int dep,int x,int y,int di)搜索排列树中第dep层子树。数组board[0][x][y]记录排列树中的节点信息。dirs记录当前节点对应的转弯数, best记录最少转弯数。 在算法void backtrack (int dep,int x,int y,int di)中,当i>n时,算法搜索至叶节点,其相应的转弯数dirs。如果dirs>best,则表示当前解优于最优解,此时更新best。当i≤n时,当前扩展节点位于是排列树的第i-1层。此时算法选择下一个要搜索的方向,以深度优先的方式递归地对相应子树进行搜。对于不满足上界约束的节点,则减去相应子树。 算法void backtrack (int dep,int x,int y,int di)动态地生成问题的解空间树。 时间复杂度为整个状态空间,即迷宫大小,O(m*n)

罗密欧与朱丽叶迷宫求解问题

课程设计说明书 课程名称__软件专题训练____ 题目罗密欧与朱丽叶迷宫求解问题_ 院系_电子信息工程学院计算机系_ 班级_计算机科学与技术103班__ 学生姓名___________ 指导教师_孙士保、冀治航__ 日期_ 2012.5.21—2012.5.27__

课程设计任务书 课程名称__算法设计与分析___ 题目_罗密欧与朱丽叶的迷宫问题 院系_电子信息工程学院计算机系_ 班级___计算机103班_____ 学生姓名____魏鹏超______ 指导教师_孙士保、冀治航__ 日期_ 2012.5.21—2012.5.27__

河南科技大学 课程设计报告 课程名称__软件专题训练____ 题目_罗密欧与朱丽叶的迷宫问题 院系:电子信息工程学院计算机系 专业:计算机科学与技术 班级:计算机10级 学生姓名:学号: 起止日期: 2012年5月21日~ 2012年5月27日指导教师:孙士保、冀治航

目录 第一章需求分析 (4) 1.1课程设计题目 (4) 1.2 课程设计任务及要求 (4) 1.3运行环境及开发工具 (4) 第二章概要设计 (5) 2.1系统流程图 (5) 第三章详细设计 (6) 3.1函数划分 (6) 3.2函数之间的关系 (6) 第四章系统调试与操作说明 (7) 4.1系统调试及操作说明 (7) 第五章课程设计总结体会 (8) 5.1课程设计总结 (8) 5.2致谢 (8) 5.3参考文献 (8)

第一章需求分析 1.1课程设计题目 罗密欧与朱丽叶的迷宫问题 1.2 课程设计任务及要求 1、对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽 叶的所有最少转弯道路 2、程序能够演示一条罗密欧找到朱丽叶的路线过程等 罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿8 个方向进入未封闭的房间。罗密欧位于迷宫的(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。每改变一次前进方向算作转弯一次。请设计一个算法帮助罗密欧找出这样一条路。 1.3运行环境及开发工具 硬件:装有windows操作系统的计算机 软件:Visual C++6.0

C语言课程设计--迷宫

C语言课程设计报告题目:迷宫问题 姓名: 班级: 学号: 组员: 指导教师: 学院: 专业:

课程设计(报告)任务及评语

目录 第1章课程设计的目的与要求 (1) 1.1 课程设计目的 (1) 1.2 课程设计的实验环境 (1) 1.3 课程设计的预备知识 (1) 1.4 课程设计要求 (1) 第2章课程设计内容 (2) 2.1程序功能介绍 (2) 2.2程序整体设计说明 (2) 2.2.1设计思路 (2) 2.2.2数据结构设计及用法说明 (3) 2.2.3程序结构(流程图) (4) 2.2.4各模块的功能及程序说明 (6) 2.2.5程序结果 (7) 2.3程序源代码及注释 (7) 第3章课程设计总结 (17) 参考资料 (18)

第1章课程设计的目的与要求 1.1 课程设计目的 本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对C语言课程的基本知识的理解和掌握 2. 掌握C语言编程和程序调试的基本技能 3. 利用C语言进行基本的软件设计 4. 掌握书写程序设计说明文档的能力 5. 提高运用C语言解决实际问题的能力 1.2 课程设计的实验环境 硬件要求能运行Windows 2000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。 1.3 课程设计的预备知识 熟悉C语言及C语言开发工具。 1.4 课程设计要求 1. 分析课程设计题目的要求 2. 写出详细设计说明 3. 编写程序代码,调试程序使其能正确运行 4. 设计完成的软件要便于操作和使用 5. 设计完成后提交课程设计报告

C语言迷宫程序

基于栈的C语言迷宫问题与实现 一.问题描述 多年以来,迷宫问题一直是令人感兴趣的题目。实验心理学家训练老鼠在迷宫中寻找食物。许多神秘主义小说家也曾经把英国乡村花园迷宫作为谋杀现场。于是,老鼠过迷宫问题就此产生,这是一个很有趣的计算机问题,主要利用“栈”是老鼠通过尝试的办法从入口穿过迷宫走到出口。 迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。 一个迷宫可用上图所示方阵[m,n]表示,0表示能通过,1 表示不能通过。现假设耗子从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角[m,n] 出去的路径。下图是一个迷宫的示意图: 迷宫示意图 二.算法基本思想 迷宫问题是栈应用的一个典型例子。求解过程可采用回溯法。回溯法是一种不断试探且及时纠正错误的搜索方法。从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向; 若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。 在求解过程中,为了保证在到达某一点后不能向前继续行走(无路)时,能正确返回前

一点以便继续从下一个方向向前试探,则需要用一个栈保存所能够到达的每一点的下标及从该点前进的方向,栈中保存的就是一条迷宫的通路。 为了确保程序能够终止,调整时,必须保证曾被放弃过的填数序列不被再次试验,即要求按某种有序模型生成填数序列。给解的候选者设定一个被检验的顺序,按这个顺序逐一生成候选者并检验。 三.主要数据结构 1.方阵栈: #define STACK_INI_SIZE 100 typedef struct { int *top; //指向栈的顶端域 int *base; //指向栈的低端域 int length; //栈的长度 int stacksize; //栈的最大长度 }sqstack; 2.产生迷宫的矩阵二维数组 为了使每一个迷宫存在迷宫的边界和两个端口:入口、出口,设置了一个二维数组,在迷宫的周边定义为1,使得迷宫存在边界,并在(1,1),(x-2,y-2)初定义为0,即定义迷宫的出口,大大减小了无解的情况。 for(i=0;i

回溯法解迷宫问题

算法分析与设计论文论文题目:回溯法解迷宫问题 作者姓名陈相艺 任课教师王松 学院班级计算机学院计自1101班 学号201126100404 提交日期2013年6月10日

回溯法解迷宫问题 陈相艺 (计算机+自动化1101 201126100404) 摘要:迷宫的存储结构以二维数组来存储,用0,1表示通或不通。表面上似乎迷宫问题是一种特殊问题的解决方法,其实迷宫问题是一种特殊形式图的问题,因此,迷宫总量可转化为图的问题来解决。设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论.本文采用回溯法求解迷宫路径,算法用到数据结构中的栈。 关键词:迷宫;二位数组;回溯法;栈;矩阵。 1.前言 迷宫实验是取自心理学的一个古典实验.在该实验中,把一只老鼠从一个无顶大盒子放入,在盒中设立了许多墙,对行进方向形成了多处阻挡.盒子仅有一个出口处放置一快奶酪,吸引老鼠在迷宫中寻找道路以到达出口.对同一老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步.老鼠经多次试验终于得到它学习走通迷宫的线路.设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论. 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 2.迷宫问题的算法思想及研究 迷宫问题中,在寻找路径时,采用的方法通常是:从入口出发,沿某一方向向前试探,若能走通,则继续向前进;如果走不通,则要沿原路返回,换一个方向再继续试探,直到所有可能的能跟都试探完成为止。为了保证在任何位置上都能沿原路返回(回溯),要建立一个后进先出的栈来保存从入口到当前位置的路径。而且在求解迷宫路径中,所求得的路径必须是简单路径。即在求得的路径上不能有重复的同一块通道。 为了表示迷宫,设置一个数组,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,数组如下所示: int mg[10][10] = { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,1,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}}; (可根据自己喜好,改变迷宫的大小和通道安排。) 对于迷宫中每个方块,都有上下左右四个方块相邻,第i行第j列的当前方块的位置为(i,j),

迷宫游戏C语言代码讲解

/*迷宫游戏by CDQ*/ /* vc++ 6.0 编译成功 本程序参照网上一个特殊算法随机生成迷宫 该算法优点: 效率高,从入口到出口只有唯一路径,入口出口自己设定 该算法缺点: 宽度高度都必须为奇数,只能生成n*m矩阵迷宫 */ #include #include #include #include #define Height 31 //迷宫的高度,必须为奇数 #define Width 25 //迷宫的宽度,必须为奇数 #define Wall 1 #define Road 0 #define Start 2 #define End 3 #define Esc 5 #define Up 1 #define Down 2 #define Left 3 #define Right 4 int map[Height+2][Width+2]; void gotoxy(int x,int y) //移动坐标 { COORD coord; coord.X=x; coord.Y=y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); } void hidden()//隐藏光标 { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=0;//赋1为显示,赋0为隐藏 SetConsoleCursorInfo(hOut,&cci); } void create(int x,int y) //随机生成迷宫 { int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向 int i,j,t;

求解迷宫问题(c语言,很详细哦)

求迷宫问题就是求出从入口到出口的路径。在求解时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。 首先用如图所示的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。 为了表示迷宫,设置一个数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,如图所示的迷宫,对应的迷宫数组mg如下: int mg[M+1][N+1]={ /*M=10,N=10*/ {1,1,1,1,1,1,1,1,1,1},

{1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; 伪代码:

c语言描述如下: void mgpath() /*路径为:(1,1)->(M-2,N-2)*/ { int i,j,di,find,k; top++; /*初始方块进栈*/ Stack[top].i=1; Stack[top].j=1;

求解迷宫问题(c语言,很详细哦)

求迷宫问题就是求出从入口到出口的路径。在求解时, 通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通, 则继续往前走;否则沿原路退回,换一个方向再继续试探, 直至所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯), 需要用一个后进先出的栈来保存从入口到当前位置的路径。 首先用如图3.3 所示的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。所求路径必须是简单路径, 即在求得的路径上不能重复出现同一通道块。 为了表示迷宫, 设置一个数组mg,其中每个元素表示一个方块的状态, 为0 时表示对应方块是通道, 为1 时表示对应方块为墙, 如图3.3 所示的迷宫, 对应的迷宫数组mg如下: int mg[M+1][N+1]={ /*M=10,N=10*/ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1},

{1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; 伪代码: c 语言描述如下:

void mgpath() /* 路径为:(1,1)->(M-2,N-2)*/ { 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-2 && j==N-2) /* 找到了出口, 输出路径*/ { printf(" 迷宫路径如下:\n"); for (k=0;k<=top;k++) { printf("\t(%d,%d)",Stack[k].i,Stack[k] .j); if ((k+1)%5==0) printf("\n"); }

c语言实现 迷宫问题.

数据结构试验——迷宫问题 (一)基本问题 1.问题描述 这是心理学中的一个经典问题。心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。 简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。本题设置的迷宫如图1所示。 入口 出口 图1 迷宫示意图 迷宫四周设为墙;无填充处,为可通处。设每个点有四个可通方向,分别为东、南、西、北(为了清晰,以下称“上下左右”)。左上角为入口。右下角为出口。迷宫有一个入口,一个出口。设计程序求解迷宫的一条通路。 2.数据结构设计 以一个m×n的数组mg表示迷宫,每个元素表示一个方块状态,数组元素0和1分别表示迷宫中的通路和障碍。迷宫四周为墙,对应的迷宫数组的边界元素均为1。根据题目中的数据,设置一个数组mg如下 int mg[M+2][N+2]= { {1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1}, {1,1,0,0,0,1,1,1}, {1,0,0,1,0,0,0,1}, {1,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1} };在算法中用到的栈采用顺序存储结构,将栈定义为 Struct { int i; //当前方块的行号 int j; //当前方块的列号 int di; //di是下一个相邻的可走的方位号 }st[MaxSize];// 定义栈

int top=-1 //初始化栈 3设计运算算法 要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。 方向:每一个可通点有4个可尝试的方向,向不同的方向前进时,目的地的坐标不同。预先把4个方向上的位移存在一个数组中。如把上、右、下、左(即顺时针方向)依次编号为0、1、2、3.其增量数组move[4]如图3所示。 move[4] x y 0 -1 0 1 0 1 2 1 0 3 0 -1 图2数组move[4] 方位示意图如下: 通路:通路上的每一个点有3个属性:一个横坐标属性i、一个列坐标属性j和一个方向属性di,表示其下一点的位置。如果约定尝试的顺序为上、右、下、左(即顺时针方向),则每尝试一个方向不通时,di值增1,当d增至4时,表示此位置一定不是通路上的点,从栈中去除。在找到出口时,栈中保存的就是一条迷宫通路。 (1)下面介绍求解迷宫(xi,yj)到终点(xe,ye)的路径的函数:先将入口进栈(其初始位置设置为—1),在栈不空时循环——取栈顶方块(不退栈)①若该方块为出口,输出所有的方块即为路径,其代码和相应解释如下:

迷宫c语言

迷宫c语言 #include <stdio.h> #include <conio.h> #include <windows.h> #include <time.h> #define Height 31 //迷宫的高度,必须为奇数#define Width 25 //迷宫的宽度,必须为奇数 #define Wall 1 #define Road 0 #define Start 2 #define End 3 #define Esc 5 #define Up 1 #define Down 2 #define Left 3 #define Right 4 int map[Height+2][Width+2]; void gotoxy(int x,int y) //移动坐标 {

COORD coord; coord.X=x; coord.Y=y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); } void hidden()//隐藏光标 { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=0;//赋1为显示,赋0为隐藏 SetConsoleCursorInfo(hOut,&cci); } void create(int x,int y) //随机生成迷宫 { int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向 int i,j,t; //将方向打乱 for(i=0;i<4;i++) { j=rand()%4;

数据结构实验-迷宫问题

迷宫问题 一、实验目的 掌握采用深度优先策略求解迷宫问题 二、实验内容 本实验解决陷入迷宫的老鼠如何找到出口的问题,老鼠希望尝试所有的路径之后走出迷宫,如果它到达一个死胡同,将原路返回到上一个位置,尝试新的路径。在每个位置上老鼠可以向8个方向运动,即东、南、西、北、东南、东北、西南、西北。无论离出口多远,它总是按照这样的顺序尝试,当到达一个死胡同之后,老鼠将进行“回溯”,迷宫只有一个入口、一个出口,设计程序输出迷宫的一条通路,实验内容如下: (1)设计迷宫的存储结构; (2)采用回溯法设计求解通路的算法,利用栈实现回溯算法。迷宫如下: Enter-> 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 --> EXIT 下面是可能的路径(注意:从入口到出口可能有多条路径,优先选择的方向不同,路径可能也不一样!)Path: ( maze[0][0], maze[1][0], maze[1][1], maze[1][2], maze[2][2], maze[3][2], maze[3][3], maze[4][3], maze[5][3], maze[6][3], maze[6][4], maze[6][5], maze[5][5], maze[4][5], maze[3][5], maze[2][5], maze[2][6], maze[1][6], maze[0][6], maze[0][7], maze[0][8], maze[1][8], maze[2][8], maze[3][8], maze[4][8], maze[5][8], maze[5][7], maze[6][7], maze[7][7], maze[8][7], maze[8][8], maze[8][9], maze[9][9]) Enter-> X 1 1 1 0 0 X---X---X 0 X---X---X 1 0 0 X 1 X 0 0 1 X 1 1 X---X 1 X 0 0 1 X---X 1 X 1 1 X 0 0 1 0 X 1 X 1 1 X 0 1 1 1 X 1 X 1 X---X 0 0 0 1 X---X---X 1 X 1 1 0 0 1 0 0 0 1 X 1 1 0 1 1 0 1 0 1 X-- X-- X 0 0 0 0 1 0 1 1 0 X --> EXIT 1、提示:

回溯算法解迷宫问题C语言-Read

回溯算法解迷宫问题(C语言) 回溯法也称为试探法,该方法首放弃关于问题规模大小的限制,并将问题的候选解按某一顺序逐一枚举和试验.当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探.如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解.在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯.扩大当前候选解的规模,并继续试探的过程成为向前试探. 为了确保程序能够终止,调整时,必须保证曾被放弃过的填数序列不被再次试验,即要求按某种有序模型生成填数序列.给解的候选者设定一个被检验的顺序,按这个顺序逐一生成候选者并检验. 对于迷宫问题,我想用回溯法的难点就在如何为解空间排序,以确保曾被放弃过的填数序列不被再次试验.在二维迷宫里面,从出发点开始,每个点按四邻域算,按照右,上,左,下的顺序搜索下一落脚点,有路则进,无路即退,前点再从下一个方向搜索,即可构成一有序模型.下表即迷宫 { 1,1,1,1,1,1,1,1,1,1, 0,0,0,1,0,0,0,1,0,1, 1,1,0,1,0,0,0,1,0,1, 1,0,0,0,0,1,1,0,0,1, 1,0,1,1,1,0,0,0,0,1, 1,0,0,0,1,0,0,0,0,0, 1,0,1,0,0,0,1,0,0,1, 1,0,1,1,1,0,1,1,0,1, 1,1,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1} 从出发点开始,按序查找下一点所选点列构成有序数列,如果4个方向都搜遍都无路走,就回退,并置前点的方向加1,依此类推....... 1 2 3 4 5 6 7 8 9 10 x 1 1 1 2 3 3 3 2 ... y 0 1 2 2 2 3 4 4 ... c 1 1 3 3 1 1 2 1 ... #include #include #define n1 10 #define n2 10 typedef struct node { int x; //存x坐标 int y; //存Y坐标

C语言编写的迷宫小游戏_源代码

C语言编写的迷宫小游戏源代码 #include #include #include #include #include #define N 20/*迷宫的大小,可改变*/ int oldmap[N][N];/*递归用的数组,用全局变量节约时间*/ int yes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/ int way[100][2],wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/ void Init(void);/*图形初始化*/ void Close(void);/*图形关闭*/ void DrawPeople(int *x,int *y,int n);/*画人工探索物图*/ void PeopleFind(int (*x)[N]);/*人工探索*/ void WayCopy(int (*x)[N],int (*y)[N]);/*为了8个方向的递归,把旧迷宫图拷贝给新数组*/ int FindWay(int (*x)[N],int i,int j);/*自动探索函数*/ void MapRand(int (*x)[N]);/*随机生成迷宫函数*/ void PrMap(int (*x)[N]);/*输出迷宫图函数*/ void Result(void);/*输出结果处理*/ void Find(void);/*成功处理*/ void NotFind(void);/*失败处理*/ void main(void)/*主函数*/ { int map[N][N]; /*迷宫数组*/ char ch; clrscr(); printf("\n Please select hand(1) else auto\n");/*选择探索方式*/ scanf("%c",&ch); Init(); /*初始化*/ MapRand(map);/*生成迷宫*/ PrMap(map);/*显示迷宫图*/ if(ch=='1') PeopleFind(map);/*人工探索*/ else FindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/ Result();/*输出结果*/ Close(); } void Init(void)/*图形初始化*/ {

迷宫的求解

课程设计的名称:迷宫的求解问题 1. 问题描述:迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。 2. 基本要求: (1)首先建立一个表示迷宫的数据结构; (2)要有试探方向和栈的设计; (3)不能重复到达某点,不能发生死循环; 3. 算法思想: 若当前位置可通,则纳入路径,继续前进;若当前位置不可通,则后退,换方向继续探索;若四周均无通路,则将当前位置从路径中删去。 4. 模块划分: (1)int maze[n1][n2]是首先建立一个迷宫的矩阵,0为通路,1为不通。 (2)main()函数将初始化top[],使得所有的开始方向为左。 (3)采用回溯法不断地试探并且及时的纠正错误,使得能够找到正确的路径。 5.数据结构 (1)坐标点的结构定义如下: typedef struct node { int x; int y; int c; }linkstack; (2)迷宫的数据结构定义如下: maze[m][n] maze[i][j]=0 通路 maze[i][j]=1 不通 6. 源程序: #include #include #define n1 10 #define n2 10 typedef struct node { int x;//存x坐标 int y;//存y坐标 int c;//存该点可能的下点所在的方向,1表示向右,2向上,3向左,4向右 }linkstack; linkstack top[100];

相关文档