新课程设计Word格式文档下载.docx
- 文档编号:21859195
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:32
- 大小:302.64KB
新课程设计Word格式文档下载.docx
《新课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《新课程设计Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。
题目一迷宫求解
一、设计题目:
迷宫求解问题
二、需要分析:
任务:
可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出
输入数据:
输入开始界面的选项1-4,选择1初始化建立迷宫图,输入(0、1)建立正方形迷宫图;
选择2输入迷宫入口坐标和出口坐标;
选择3判断是否为通路并显示可通路径。
选择4退出出程序。
输出形式:
输出迷宫图以及走出迷宫的路径;
程序所能达到的功能输出迷宫图以及走出迷宫的路径“1”代表障碍物“0”代表路径,“#”代表外围迷宫墙,“*”显示迷宫可通时的路径;
如果主函数选项错误显示“选项错误,请从新输入要选择项目”,选择迷宫尺寸超出范围显示“输入错误”;
如果输入迷宫有路径时显示“找到通路”,如果迷宫有路径显示迷宫图以及走出路径和“找不到通路”。
三.概要设计
1.定义栈的抽象数据类型定义:
ADTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,...,n}
基本操作:
typedefstructSqStack//构造一个栈的结构体
StatusInitStack(Stack&
S)//建立一个空栈
StatusStackEmpty(StackS)//若s为空返回TRUE,否则返回FALSE
StatusPush(Stack&
S,SElemTypee)//插入元素e为新的栈顶元素
StatusPop(Stack&
S,SElemType&
e)//若栈不空删除栈顶元素用e返回并返回OK,
2.定义迷宫的抽象数据类型
ADTMaze{
voidInitmaze(intmaze[22][22],intsize)//初始化迷宫
voidPrintmaze(intmaze[22][22],intsize)//显示初始化迷宫图形
voidPrintmaze(intmaze[22][22],intsize)//将标记路径信息的迷宫输出到终端(包括外墙)
StatusPass(intmaze[22][22],PosTypeCurPos)//当前位置可通则返回TURE,否则返回FALSE
voidMarkfoot(intmaze[22][22],PosTypeCurPos)//标记当前位置可通
StatusMazePath(MazeType&
maze,PostTypestart,PostTypeend)//若迷宫maze存在从入口start到end的通道则求得一条存放在栈中;
并返回TRUE,否则返回FALSE
PosTypeNextPos(PosTypeCurPos,intDir)//进入下一位置寻找可通路径
StatusMazePath(intmaze[22][22],SqStack&
S,PosTypestart,PosTypeend)//若迷宫maze中从入口start到出口end的通道,则求得一条存放在栈中
3.主程序包含三个模块:
1)voidmain(){//主函数
输出开始界面;
由switch()语句调用各函数;
输出测试结果;
}
2)栈模块---实现栈抽象数据类型
3)迷宫模块---实现迷宫抽象数据类型
各模块调用关系如下:
主程序模块
迷宫模块
栈模块
四.详细设计
1.主程序中的需要全程量
#defineSTACK_INIT_SIZE100//存储空间初始分配量
#defineSTACKINCREMENT10//存储空间分配增量
2.迷宫类型:
typedefstructPosType//定义通道块通道坐标结构体
{
introw;
//迷宫行号
intline;
//迷宫列号
}PosType;
typedefstructdf
intord;
//通道快路径上的序号
PosTypeseat;
//通道块在迷宫中的坐标位置
intdi;
//从此通道块走向下一通道块的方向
}SElemType;
3.栈类型
typedefstructSqStack//初始化一个栈的结构
{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
4.求解迷宫迷宫的部分伪代码:
voidInitmaze(intmaze[22][22],intsize)
{inti;
Printf("
----------输入一个迷宫布局(0和1)-------------\n"
);
for(i=0;
i<
size+2;
i++)maze[0][i]=1;
for(i=1;
size+1;
i++)
{……
for(j=1;
j<
j++)
scanf("
%d"
&
maze[i][j]);
…………}
for(i=0;
i++)maze[size+1][i]=1;
}
voidPrintmaze(intmaze[22][22],intsize)//显示初始化后的迷宫
{inti,j;
Printf("
\n\n"
显示所建的迷宫(#表示外面的墙):
\n"
i++)Printf("
%c"
'
#'
for(i=1;
{Printf("
…...
%d"
maze[i][j]);
…….
%c"
}//for
StatusPass(intmaze[22][22],PosTypeCurPos)//当前位置可通则返回OK,否则返回ERROR
if(maze[CurPos.row][CurPos.line]==0)
returnOK;
//如果当前位置是可以通过,回1
elseif(maze[CurPos.row][CurPos.line]==1)
returnERROR;
//其它情况返回0
}PosTypeNextPos(PosTypeCurPos,intDir)//进入下一位置
PosTypeReturnPos;
switch(Dir)
......
}returnReturnPos;
//若迷宫maze中从入口start到出口end的通道,则求得一条存放在栈中
S,PosTypestart,PosTypeend)
PosTypecurpos;
intcurstep;
SElemTypee;
InitStack(S);
curpos=start;
//设定"
当前位置"
为"
入口位置
curstep=1;
//探索第一步
do{
if(Pass(maze,curpos))//当前位置可通过,即是未曾走到过的通道块
{
Markfoot(maze,curpos);
//留下足迹
e.di=1;
e.ord=curstep;
e.seat=curpos;
Push(S,e);
//加入路径
if(curpos.row==end.row&
&
curpos.line==end.line)
//到达终点(出口)
curpos=NextPos(curpos,1);
//下一位置是当前位置的东邻
curstep++;
//探索下一步
else//当前位置不能通过
if(!
StackEmpty(S))
Pop(S,e);
while(e.di==4&
!
Markfoot(maze,e.seat);
//留下不能通过的标记,并退回一步
if(e.di<
4)
e.di++;
//换下一个方向探索
Push(S,e);
curpos=NextPos(e.seat,e.di);
//当前位置设为新方向的相邻块
}while(!
StackEmpty(S));
voidPrintpath(intmaze[22][22],SqStackS,intsize)//输出路径
{......
while(p!
=S.top)
maze[p->
seat.row][p->
seat.line]=2;
//标记为路径中的点
p++;
}
for(j=1;
j++)
if(maze[i][j]==2)Printf("
*'
……
}//for
5.函数调用关系图反映了演示程序的层次结构:
五.调试分析
1.即迷宫的路径,所以总的调试比较顺利,只是在调试,发现好多地方都遗漏去地址符&
,导致所建立的IintStack()不能运行;
一开始有些函数函数都是已声明后使用,调换主函数位置以及其他调用别的函数的先后书写位置;
标志通路路径和原来以0标记的路径混淆,导致显示迷宫图式失败,修改通路标记路径maze[p->
//标记为路径中的点。
2.本实验有三主要算法:
InitMaze;
MazePath和PrintMaze时间复杂度均为:
O(size*size)空间复杂度为O(size*size)(栈所占空间最大);
六.测试结果;
1、创建并显示一个迷宫
2、输入入口坐标和出口坐标
输入入口行坐标和列坐标:
1,1.
输入出口行坐标和列坐标:
1,6。
3、判断是否为通路并显示路径
4退出程序
附录(原程序代码)
#include<
stdio.h>
stdlib.h>
iostream>
usingnamespacestd;
#defineERROR0
#defineOK1
typedefintStatus;
//status是函数的类型,其值是函数结果状态代码
//行号
//列号
////////////////////////////////////////////////////////////////////////////////////////
intInitStack(SqStack&
S)//建立一个空栈
S.base=newSElemType;
if(!
S.base)exit(0);
//存储失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
/////////////////////////////////////////////////////////////////////////////////////////
StatusPush(SqStack&
S,SElemTypee)//插入e为新的栈顶元素
{if(S.top-S.base>
=S.stacksize)//栈满追加存储空间
{S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
//存储失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*S.top++=e;
StatusPop(SqStack&
e)//删除栈顶元素,e返回其值
if(S.top==S.base)returnERROR;
e=*--S.top;
////////////////////////////////////////////////////////////////////////////////////////
StatusStackEmpty(SqStackS)//检查是否空栈
if(S.top==S.base)returnOK;
voidInitmaze(intmaze[22][22],intsize)//初始化迷宫
printf("
{intj;
maze[i][0]=1;
maze[i][size+1]=1;
///////////////////////////////////////////////////////////////////////////////////
voidPrintmaze(intmaze[22][22],intsize)//显示迷宫
printf("
i++)printf("
///////////////////////////////////////////////////////////////////////////////////////
SElemType*p=S.base;
\n\n通路路径为:
if(maze[i][j]==2)printf("
elseprintf("
//////////////////////////////////////////////////////////////////////////////
StatusPass(intmaze[22][22],PosTypeCurPos)//判断当前位置是否可通
//如果当前位置是可以通过,返回1
//////////////////////////////////////////////////////////////////////////
voidMarkfoot(intmaze[22][22],PosTypeCurPos)//标记当前位置不可通
maze[CurPos.row][CurPos.line]=1;
///////////////////////////////////////////////////////////////////////////
PosTypeNextPos(PosTypeCurPos,intDir)//进入下一位置
case1:
//向左寻找路径
ReturnPos.row=CurPos.row;
ReturnPos.line=CurPos.line+1;
break;
case2:
//向下寻找路径
ReturnPos.row=CurPos.row+1;
ReturnPos.line=CurPos.line;
case3:
ReturnPos.line=CurPos.line-1;
case4:
//向上寻找路径
ReturnPos.row=CurPos.row-1;
returnReturnPos;
PosTypecurpos
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 新课程 设计