c++课程设计迷宫问题求解

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);}

}

//迷宫求解

相关文档
最新文档