| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 681 人关注过本帖
标题:帮我补充下。(初学)
只看楼主 加入收藏
雏菊
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-10-16
收藏
 问题点数:0 回复次数:0 
帮我补充下。(初学)
需求
(1) 以二维数组Maze[ m+2 ][ n+2 ]表示迷宫,其中:Maze[ 0 ][ j ]和Maze[ m+1 ][ j ](0≤j≤n+1)及Maze[ i ][ 0 ]和Maze[

i ][ n+1 ](0≤i≤m+1)为添加的一圈障碍。数组中以元素值为0表示通路,1表示障碍。限定迷宫大小m,n≤10。
(2) 用户以文件的形式输入迷宫的数据:文件中第一行的数据为迷宫的行数m和列数n;从第2行至第m+1行(每行n个数)为迷宫值,

同一行中的两个数字之间用空白字符相隔。
(3) 迷宫的入口位置和出口位置可由用户随时设定。
(4) 若设定的迷宫存在通路,则以长方阵形式将迷宫及其通路输出到标准输出文件(即终端)上。其中,字符“#”表示障碍,字符

“*”表示路径上的位置,字符“@”表示“死胡同”,即曾途经然而不能到达出口的位置,余者用空格符印出。若设定的迷宫不存在

通路,则报告相应信息。
(5) 程序只求出一条成功的通路。然而,只需要对迷宫求解的函数作小量修改,便可求得全部路径。
(6) 测试数据如下:  
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 1
0 1 1 1 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 1
0 1 1 1 1 0 0 1
1 1 0 0 0 1 0 1
1 1 0 0 0 0 0 0
当入口位置为(1,1),出口位置为(9,8)时,输出数据应为:
 
(7) 程序执行的命令为:
1)创建迷宫; 2)求解迷宫; 3)输出迷宫的解。



概要设计:
1.坐标位置类型
typedef struct{int r,c;}PosType;
2.迷宫类型
typedef struct{ int m,n;
                char arr[RANGE][RANGE];
              }MazeType;
void InitMaze (MazeType &maze,int a[][],int row,int col)
//按照用户输入的row行和col列的二维数组(元素值为0或1),设置迷宫maze的初值,包括加上边缘一圈的值
bool MazePath (MazeType &maze,PosType start,PosType end)
//求解迷宫maze中,从入口start到出口end的一条路径,若存在,则返回TRUE;否则返回FALSE
void PrintMaze (MazeType maze)
//将迷宫以字符型方阵的形式输出到标准输出文件上
3.栈类型
typedef struct{
   PosType seat;
   directiveType di;
  }ElemType;
typedef struct NodeType{
   ElemType data;
   NodeType *next;
}NodeType,*linkType;//结点类型,指针类型
typedef struct {
   LinkType top;
   int size;
}Stack;// 栈类型
栈的基本操作设置如下:
void InitStack(Stack &S)
//初始化,设S为空栈(S.top==NULL)
void DestroyStack(Stack &S)
//销毁栈S,并释放所占空间
void ClearStack (Stack &S)
//将S清为空栈。
int StackLength(Stack S)
//返回栈S的长度S.size
Status StackEmpty(Stack S)
//若S为空栈(S.top==NULL),则返回TRUE;否则返回FALSE
Status GetTop(Stack S,ElemType e)
//若栈S不空,则以e带回栈顶元素并返回TRUE;否则返回FALSE
Status Push(Stack &S,ElemType e)
//若分配空间成功,则在S的栈顶插入新的栈顶元素e,并返回TRUE;否则栈不变,并返回FALSE
Status Pop(Stack &S,ElemType &e)
//若栈不空,则删除S的栈顶元素并以e带回其值,且返回TRUE;否则返回FALSE
void StackTraverse(Stack S,Status(*visit)(ElemType e))
//从栈底到栈顶依次对S中的每个结点调用函数visit
其中部分操作的算法:
Status Push(Stack &S,ElemType e)
{//若分配空间成功,则在S的栈顶插入新的栈顶元素e,并返回TRUE;否则栈不变,并返回FALSE
if(MakeNode(p,e)){
P.next=S.top;S.top=p;
S.size++;return TRUE;
}
else return FALSE;
}
Status Pop (Stack &S,ElemType &e)
{//若栈不空,则删除S的栈顶元素并以e带回其值,且返回TRUE,否则返回FALSE,且e无意义
if(StackEmpty(S))  return FALSE;
else{
p=S.top;S.top=S.top->next;
e=p->data;S.size--;return TRUE;
}
}
4.求迷宫路径的伪码算法:
Status MazePath (MazeType maze,PosType start,PosType end)
{
//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶为从入口到出口的路径),并返回TRUE;

否则返回//FALSE
InitStack(S);curpos=start;//设定“当前位置”为“入口位置”
curstep=1;found=FALSE;//探索第一步
do{
if(Pass(maze,curpos)){
//当前位置可以通过,即是未曾走过的通道块留下足迹
FootPrint(maze,curpos);
e=(curstep,curpos,1);
Push(S,e);//加入路径
if(Same(curpos,end)) found=TRUE;//到达终点(出口)
else{
curpos=NextPos(curpos,1);//下一位置是当前位置的东邻
curstep++;//探索下一步
}//else
}//if
else//当前位置不能通过
if(!StackElmpty(S)){
Pop(S,e);
while(e.di==4&&!StackElmpty(S)){
MarkPrint(maze,e.seat);Pop(S,e);
curstep--;//留下不能通过的标记,并退回一步
}//while
if(e.di<4){e.di++;Push(S,e);//换下一个方向探索
curpos=NextPos(e.seat,e.di);//设定当前位置是该新方向上的相邻块
}//if
}//if
}while(!StackElmpty(S)&&!found);
return found;
}//MazePath
5.主函数和其他函数的伪码算法:
void main()
{
//主程序
Initialization();//初始化
Interpret();//解释执行操作
}//main

void Initialization()
{
//系统初始化
在屏幕上方显示操作命令清单:
CreatMaze--c MazePath--m PrintMaze--p Quit--q;

}//Initialization

void Interpret()
{在屏幕下方显示操作命令提示框;
//输入并解释执行操作命令cmd
switch(cmd){
case'c','C':提示用户输入“迷宫数据的文件名filename”;从文件读入数据分别存储在rnum,cnum和二维数组a2中;
InitMaze(ma,a2,rnum,cnum);//创建迷宫
输出迷宫建立完毕的信息;
break;
case'm','M':提示用户输入迷宫的入口from和出口term的坐标位置;
if(MazePath(ma,from,term))//存在路径
提示用户察看迷宫;
else 输出该迷宫没有从给定的入口到出口的路径的信息;
break;
case'p','P';PrintMaze(ma);//将标记路径信息的迷宫输出到终端
}//switch
}//Interpret
搜索更多相关主题的帖子: 初学 
2008-11-17 23:25
快速回复:帮我补充下。(初学)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018224 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved