c++课程设计迷宫问题求解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计题目
迷宫问题求解
任务
迷宫问题是取自心理学的一个古典实验。实验中,把一只老鼠从一个没有顶的大盒子的门放入,在盒中设置了许多墙,对行进的方向形成了多处阻挡。盒子仅仅有一个出口,在出口处放置了一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。重复对老鼠进行上述实验,看老鼠能在多久找到出口。
功能要求:
请设计一个算法实现迷宫问题求解。
测试数据:0表示可以行走的区域,1表示不可行走的区域。
需求分析
该程序的实现需要用到栈,用栈来储存正确的步骤。首先要建立一个迷宫,用数组来实现。然后通过规定的放向依次探索,一步步找到正确的路径。
概要设计
typedef struct StackElem
{
int x;
int y;
int f; }StackElem;
//定义栈
typedef struct
{
StackElem * base;
StackElem * top;
int StackSize;
}Stack;
//初始化栈
void StackInit(Stack *s)
//向栈中添加元素
void Push(Stack *s,StackElem e)
//获得栈顶元素
StackElem GetTop(Stack *s)
/删除栈顶元素
void Pop(Stack *s)
/判断当前位置是否走过(下一位置与Path中所有位置从栈顶至栈底依次比较)
int unPass(Stack Path,StackElem Step
/右边相邻的位置
StackElem Right(StackElem Step,int m,int n)(一共8个向函数类似)
//获得下一个可通行的位置,逐个方向试探
StackElem GetNext(StackElem Step,int m,int n)
int GetMazePath(int m,int n){//获得迷宫路径
/打印迷宫路径
void PrintMazePath(Stack *s)
void main(){
int i,j;
printf("********迷宫********\n");
printf("0 是通路\n1 是墙\n");
printf("请输入行数(<=100):");
scanf("%d",&m);
printf("请输入列数(<=100):");
scanf("%d",&n);
printf("请输入迷宫数据(按行来):\n");
for(i=0;i for(j=0;j scanf("%d",&maze[i][j]); printf("迷宫:\n"); for(i=0;i { for(j=0;j printf("\t%d",maze[i][j]); printf("\n"); } StackInit(&RealPath); StackInit(&Path); GetMazePath(m,n); printf("路径是:\n"); PrintMazePath(&RealPath); printf("\n"); } 程序调用关系如下: 主程序模块 详细设计 // #include"stdafx.h" #include"stdlib.h" #include"conio.h" #define TRUE 1 #define FAUSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define NULL 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 //定义栈元素 typedef struct StackElem { int x;//x坐标 int y;//y坐标 int f;//maze[x][y]的值 }StackElem; //定义栈 typedef struct { StackElem * base; StackElem * top; int StackSize; }Stack; //初始化迷宫,0表示通道,1表示墙 int maze[100][100]={0}; int m,n; //栈操作的实现 //初始化栈 void StackInit(Stack *s) { s->base = (StackElem *)malloc(STACK_INIT_SIZE * sizeof(StackElem)); if (!s->base) { printf("内存分配失败!\n"); exit(OVERFLOW);//内存分配失败 } s->top = s->base; s->StackSize = STACK_INIT_SIZE; } //向栈中添加元素 void Push(Stack *s,StackElem e) { if (s->top - s->base >= s->StackSize) {//栈满,增加空间 s->base=(StackElem *)realloc(s->base, (STACK_INIT_SIZE+STACKINCREMENT) * sizeof(StackElem)); if (!s->base) { printf("内存分配失败.\n "); exit(OVERFLOW);//内存分配失败 } s->top=s->base+s->StackSize;//分配空间后重置栈顶指针 s->StackSize += STACKINCREMENT;}//空间再分配完成 *(s->top++) = e;//将新元素加到栈顶 } //获得栈顶元素 StackElem GetTop(Stack *s) { if (s->top==s->base) { printf("没有路径可以走出迷宫!\n"); exit(ERROR);} else {return *(s->top - 1);} } //删除栈顶元素 void Pop(Stack *s) {//若栈不为空,则删除s的栈顶元素 if (s->top == s->base) { printf("没有路径可以走出迷宫!\n"); exit(ERROR); } else {--(s->top);} } //迷宫求解