迷宫问题算法实现

一、需求分析

本课程设计是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中要应用“栈”的思想假设“当前位置”指的是“在搜索过程中的某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。所谓“下一位置”指的是当前位置四周4个方向(东、南、西、北)上相邻的方块。假设以栈S 记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“出栈”。

二、数据结构

1. 数据结构设计考虑

1) 建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁);

2) 创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。

2. 逻辑结构存储结构

1) 创建一个Int 类型的二维数组int maze[n1][n2],用来存放0和1 ;

2) 创建一个结构体用来储存数组信息(数组的横坐标X ,数组的纵坐标Y ,方向C) typedef struct node

{

int x;

int y;

int c;

}linkstack;

3) 创造一个栈包括(top表示栈顶元素)

linkstack top[n1*n2];

三、算法设计

首先,创建数组的大小,此数组大小要求用户自己输入。具体算法:

printf("输入迷宫大小(提示:行列数不能超过50!):");

scanf("%d",&g);

printf("大小创建完毕, 请输入迷宫:\n");

其次,用户自己定义迷宫的内容,算法:

void shuzu(int g,int h){

int a,b;

for(a=0;a

for(b=0;b

scanf("%d",&maze[a][b]);

}

第三,产生迷宫,算法:

void scsu(int g,int h){

int a,b;

printf("生成的迷宫是:\n");

for(a=0;a

{ for(b=0;b

printf(maze[a][b]?"#":" ");

printf("\n");

}

}

最后,迷宫寻路找到出口,其算法见源代码。根据这些算法设计,我们设计出了迷宫求解的应用。

四、源代码

#include

#include

#define n1 50//定义行范围

#define n2 50//定义列范围

typedef struct node//创建一个结构体存储数组信息

{

int x;

int y;

int c;

}linkstack;

int maze[n1][n2]; //创建一个二维数组

linkstack top[n1*n2]; //创建一个N*N的栈

int i,j,k,m=1,run;

void shuzu(int g,int h){ //以二维数组形式定义迷宫内容

int a,b;

for(a=0;a

for(b=0;b

scanf("%d",&maze[a][b]);//输入迷宫对应的数组数据

}

void scsu(int g,int h){//生成迷宫

int a,b;

printf("生成的迷宫是:\n");

for(a=0;a

{ for(b=0;b

printf(maze[a][b]?"#":" ");//输出迷宫图形

printf("\n");

}

}

void main()

{ int g,h,v;

int w;

printf("**************************************************\n");

printf("**************************************************\n");

printf("********** 欢迎使用迷宫求解 ********\n");

printf("**************************************************\n");

printf("**************************************************\n");

printf("\n");

printf("**************************************************\n");

printf("**************************************************\n");

printf("***************迷宫求解请按:1 ******************\n");

printf("*************** 退出请按:2 ******************\n");

printf("**************************************************\n");

printf("**************************************************\n");

printf("输入您的选择:");

scanf("%d",&w);

switch(w)//若输入的W 为1或2, 则继续程序

{ case 1:printf("输入迷宫大小(提示:行列数不能超过50!):");//W为1时

scanf("%d",&g);

printf("大小创建完毕, 请输入迷宫:\n");

h=g;//确定数组大小为g 维

shuzu(g,h);

for(i=0;i

scsu(g,h);//生成迷宫

i=0;

top[i].x=1;//i=0时X 方向对应值得和为1

top[i].y=0; //i=0时Y 方向对应值得和为0

maze[1][0]=2;//入口迷宫值变为2

run=1;

v=1;

do{ //定义行走规则和出口判断

if(top[i].c

{ if(top[i].x==(g-2)&&top[i].y==(h-1))// 当i 点为出口时所满足的条件

{ printf("第%d条通路是:\n",m++);//输出不同的路程

for(j=0;j

{printf("(%d,%d)",top[j].x,top[j].y);

}//输出通路坐标

printf("\n");

for(j=0;j

{ for(k=0;k

{ if(maze[j][k]==0)

printf(" ");

else if(maze[j][k]==2)

printf("O");

else printf("#");

}

printf("\n");

}

maze[top[i].x][top[i].y]=0;

top[i].c=1;

i--;

top[i].c+=1;

continue;

}

switch(top[i].c)

{ run=0;

if(v==1)

printf("此迷宫无通路!");

break;

}

case 1:

{ if(maze[top[i].x][top[i].y+1]==0)

{ i++;

top[i].x=top[i-1].x;

top[i].y=top[i-1].y+1;

maze[top[i].x][top[i].y]=2;

if(maze[g-2][h-1]==2) v=0;

}

else top[i].c+=1;

break;

}

case 2:

{ if(maze[top[i].x-1][top[i].y]==0)

{ i++;

top[i].x=top[i-1].x-1;

top[i].y=top[i-1].y;

maze[top[i].x][top[i].y]=2;

}

else top[i].c+=1;

break;

}

case 3:

{ if(maze[top[i].x][top[i].y-1]==0)

{ i++;

top[i].x=top[i-1].x;

top[i].y=top[i-1].y-1;

maze[top[i].x][top[i].y]=2;

}

else top[i].c+=1;

break;

}

case 4:

{ if(maze[top[i].x+1][top[i].y]==0)

{ i++;

top[i].x=top[i-1].x+1;

top[i].y=top[i-1].y;

maze[top[i].x][top[i].y]=2;

}

else top[i].c+=1;

break;

}

}

}

else

{ if(i==0) return;

maze[top[i].x][top[i].y]=0;

top[i].c=1;

i--;

top[i].c+=1;

}

}while(run==1);

break;

case 2: printf("欢迎下次使用!") ;

break;

default: break;

}

}

六、体会及不足之处

通过此次课程设计,是我对于数据结构有了更深的了解,更新的认识。数据结构是一门重要的课程,只有数据结构学得扎实了,才能对于计算机有更深的应用,所以学好数据结构是很重要的。经过两周的上机设计,我实现了简单的迷宫求解,能够简单的实现求解过程。但是还存在着不足之处,不能输入矩形的数组,而且出口和入口是固定的,也可以改变可是要改变代码,本程序不能循环执行,只能执行一次。有待改进!

一、需求分析

本课程设计是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中要应用“栈”的思想假设“当前位置”指的是“在搜索过程中的某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。所谓“下一位置”指的是当前位置四周4个方向(东、南、西、北)上相邻的方块。假设以栈S 记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“出栈”。

二、数据结构

1. 数据结构设计考虑

1) 建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁);

2) 创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。

2. 逻辑结构存储结构

1) 创建一个Int 类型的二维数组int maze[n1][n2],用来存放0和1 ;

2) 创建一个结构体用来储存数组信息(数组的横坐标X ,数组的纵坐标Y ,方向C) typedef struct node

{

int x;

int y;

int c;

}linkstack;

3) 创造一个栈包括(top表示栈顶元素)

linkstack top[n1*n2];

三、算法设计

首先,创建数组的大小,此数组大小要求用户自己输入。具体算法:

printf("输入迷宫大小(提示:行列数不能超过50!):");

scanf("%d",&g);

printf("大小创建完毕, 请输入迷宫:\n");

其次,用户自己定义迷宫的内容,算法:

void shuzu(int g,int h){

int a,b;

for(a=0;a

for(b=0;b

scanf("%d",&maze[a][b]);

}

第三,产生迷宫,算法:

void scsu(int g,int h){

int a,b;

printf("生成的迷宫是:\n");

for(a=0;a

{ for(b=0;b

printf(maze[a][b]?"#":" ");

printf("\n");

}

}

最后,迷宫寻路找到出口,其算法见源代码。根据这些算法设计,我们设计出了迷宫求解的应用。

四、源代码

#include

#include

#define n1 50//定义行范围

#define n2 50//定义列范围

typedef struct node//创建一个结构体存储数组信息

{

int x;

int y;

int c;

}linkstack;

int maze[n1][n2]; //创建一个二维数组

linkstack top[n1*n2]; //创建一个N*N的栈

int i,j,k,m=1,run;

void shuzu(int g,int h){ //以二维数组形式定义迷宫内容

int a,b;

for(a=0;a

for(b=0;b

scanf("%d",&maze[a][b]);//输入迷宫对应的数组数据

}

void scsu(int g,int h){//生成迷宫

int a,b;

printf("生成的迷宫是:\n");

for(a=0;a

{ for(b=0;b

printf(maze[a][b]?"#":" ");//输出迷宫图形

printf("\n");

}

}

void main()

{ int g,h,v;

int w;

printf("**************************************************\n");

printf("**************************************************\n");

printf("********** 欢迎使用迷宫求解 ********\n");

printf("**************************************************\n");

printf("**************************************************\n");

printf("\n");

printf("**************************************************\n");

printf("**************************************************\n");

printf("***************迷宫求解请按:1 ******************\n");

printf("*************** 退出请按:2 ******************\n");

printf("**************************************************\n");

printf("**************************************************\n");

printf("输入您的选择:");

scanf("%d",&w);

switch(w)//若输入的W 为1或2, 则继续程序

{ case 1:printf("输入迷宫大小(提示:行列数不能超过50!):");//W为1时

scanf("%d",&g);

printf("大小创建完毕, 请输入迷宫:\n");

h=g;//确定数组大小为g 维

shuzu(g,h);

for(i=0;i

scsu(g,h);//生成迷宫

i=0;

top[i].x=1;//i=0时X 方向对应值得和为1

top[i].y=0; //i=0时Y 方向对应值得和为0

maze[1][0]=2;//入口迷宫值变为2

run=1;

v=1;

do{ //定义行走规则和出口判断

if(top[i].c

{ if(top[i].x==(g-2)&&top[i].y==(h-1))// 当i 点为出口时所满足的条件

{ printf("第%d条通路是:\n",m++);//输出不同的路程

for(j=0;j

{printf("(%d,%d)",top[j].x,top[j].y);

}//输出通路坐标

printf("\n");

for(j=0;j

{ for(k=0;k

{ if(maze[j][k]==0)

printf(" ");

else if(maze[j][k]==2)

printf("O");

else printf("#");

}

printf("\n");

}

maze[top[i].x][top[i].y]=0;

top[i].c=1;

i--;

top[i].c+=1;

continue;

}

switch(top[i].c)

{ run=0;

if(v==1)

printf("此迷宫无通路!");

break;

}

case 1:

{ if(maze[top[i].x][top[i].y+1]==0)

{ i++;

top[i].x=top[i-1].x;

top[i].y=top[i-1].y+1;

maze[top[i].x][top[i].y]=2;

if(maze[g-2][h-1]==2) v=0;

}

else top[i].c+=1;

break;

}

case 2:

{ if(maze[top[i].x-1][top[i].y]==0)

{ i++;

top[i].x=top[i-1].x-1;

top[i].y=top[i-1].y;

maze[top[i].x][top[i].y]=2;

}

else top[i].c+=1;

break;

}

case 3:

{ if(maze[top[i].x][top[i].y-1]==0)

{ i++;

top[i].x=top[i-1].x;

top[i].y=top[i-1].y-1;

maze[top[i].x][top[i].y]=2;

}

else top[i].c+=1;

break;

}

case 4:

{ if(maze[top[i].x+1][top[i].y]==0)

{ i++;

top[i].x=top[i-1].x+1;

top[i].y=top[i-1].y;

maze[top[i].x][top[i].y]=2;

}

else top[i].c+=1;

break;

}

}

}

else

{ if(i==0) return;

maze[top[i].x][top[i].y]=0;

top[i].c=1;

i--;

top[i].c+=1;

}

}while(run==1);

break;

case 2: printf("欢迎下次使用!") ;

break;

default: break;

}

}

六、体会及不足之处

通过此次课程设计,是我对于数据结构有了更深的了解,更新的认识。数据结构是一门重要的课程,只有数据结构学得扎实了,才能对于计算机有更深的应用,所以学好数据结构是很重要的。经过两周的上机设计,我实现了简单的迷宫求解,能够简单的实现求解过程。但是还存在着不足之处,不能输入矩形的数组,而且出口和入口是固定的,也可以改变可是要改变代码,本程序不能循环执行,只能执行一次。有待改进!


相关文章

  • 基于栈实现的迷宫问题
  • 基于栈实现的迷宫问题 1.问题描述: 在一个二维阵列构成的迷宫里, 数组元素仅有0和1构成,其中 0表示可通行的路径, 1代表障碍.另外,定义左上角是迷宫的入口, 右下角是迷宫的出口, 在迷宫里面只允许上下左右四个方向行走, 2.算法基本思 ...查看


  • 电子工艺实习实验报告
  • 电子工艺实习实验报告 (迷宫车实验) 院 系:xxxxxxxxxxxxx 姓名:xxxx 班 级:xxxxxxxxxx 学 号: 一. 任务要求 此次实验共有三个部分焊接练习,基本交替闪烁电路焊接和小车的制作与调试. 学生要按照老师要求完成 ...查看


  • 迷宫问题2数据结构实验报告
  • 南昌航空大学实验报告 课程名称: 数据结构 实验名称:实验三.四:栈和队列应用-迷宫问题 班 级: 学生姓名: 学号: 指导教师评定: 签 名: 题目:假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为 (m,n ...查看


  • 数学建模经典算法
  • 寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个,在检查完所有或部分候选解后,即可找到所需要的解.理论上,当候选解数量有限并且通过检查所有或部分候选解能够得到所需解时,上述方法是可行的.不过,在实际应用中,很少使用这种方 ...查看


  • 数据结构课程设计题目详细要求
  • 课程设计方案及要求 一.课设说明 本次课设有两个方案,方案A 和方案B ,每个方案有两个题目(两个题目均要完成).大家可以任选一个方案进行课设. 二.时间安排 17周 周二 上午 软2 周二 下午 软3 周四 上午 软2 周五 上午 软2 ...查看


  • Java程序设计报告
  • <Java程序设计> 综 合 性 实 验 报 告 题目 标准化考试系统 级班 学生姓名 学号 学生姓名 学号任课老师 职称 2010年12月 目录 标准化考试系统案例分析 一. 案例背景和意义 本案例是C/S模式的标准话考试系统 ...查看


  • 走迷宫游戏
  • 课程名称: <数据结构>课程设计 课程设计题目: 走迷宫游戏 姓 名: 周楠 院系: 计算机学院 专 业: 软件工程 年 级: 2011 学 号: E01114323 指导教师: 王爱平 2013 年 9月29 日 目 录 1 ...查看


  • 电脑鼠走迷宫算法C语言
  • #include "stdio.h" #include "action.h" #include "bmp_pixel.h" #include "NOKIA_5110.h& ...查看


  • B5分治思想与递归算法的应用
  • 一.分治思想 例1.找伪币 [问题描述] 给你一个装有16个硬币的袋子,16个硬币中有一 个是伪造的,并且那个伪造的硬币比真的硬币要轻一 些. 你的任务是找出这个伪造的硬币. 为了帮助你完成这一任务,将提供一台可用来比 较两组硬币重量的仪器 ...查看


热门内容