真心求用C语言编个代码实现迷宫问题。

整个程序被分成几个文件。仔细看。每个程序都放在一个文件中,每个程序前面都有一个文件名:

//stackoperation.cpp

状态init stack(sq stack & amp;s)

{//构造一个空堆栈

s . base =(selem type *)malloc(RANGE * sizeof(selem type));

如果(!S.base)退出(溢出);//存储分配失败

s . top = s . base;

S.stacksize = RANGE

退货OK;

}//初始化堆栈

状态推送(SqStack & amps,选择类型e)

{//将元素E作为新的堆栈顶部元素插入。

if(s . top-s . base & gt;= S.stacksize){//堆栈已满,还有额外的存储空间可用。

s . base =(selem type *)realloc(s . base,(s . stack size+stack increment)* sizeof(selem type));

如果(!S.base)退出(溢出);//存储分配失败

s . top = s . base+s . stack size;

s . stack size+= stack increment;

}

* s . top++ = e;

退货OK;

}//推送

状态弹出(SqStack & amps,选择类型& ampe){

/*如果栈不为空,删除S的顶层元素,用E返回其值,返回OK;

否则返回错误*/

if(S.top == S.base)返回错误;

e = *-s . top;

退货OK;

}//弹出

布尔堆栈属性(SqStack S)

{//确定堆栈是否为空,并返回turn或FALSE。

if(S.top == S.base)返回TURE

返回FALSE

}//StackEmpty

void PrintStack()

{

SqStack ST

选择e型;

init stack(ST);

做{

Pop(SqS,e);

推(ST,e);

}while(!StackEmpty(SqS));

做{

Pop(ST,e);

printf("(%d,%d,%d)",e.seat.i,e.seat.j,e . di);

}while(!StackEmpty(ST));

}

//migong.cpp

#包含“Basetype.h”

#包含" stackoperation.cpp "

#包含“Mazeoperation.cpp”

void main()

{

char文件名[15];

FILE * fp

Printf("请输入迷宫数据文件名(长度不得超过15个字符):");

scanf("%s ",& amp文件名);

//如果找不到文件,需要重新输入(最多三次机会)。

for(int I = 0;我& lt3;i++){

if((fp = fopen(filename," r))= = NULL)

{printf("无法打开文件,请重新输入文件名(长度不超过15个字符):\ n ");

scanf("%s ",文件名);

}//如果

打破;

}//for

//读取迷宫的行数和列数。

int rnum,cnum

fscanf(fp," %d,%d ",& amprnum & amp;cnum);

Printf("这个迷宫有%d行%d列\n ",rnum,cnum);

if(rnum & gt;RANGE-2 | | cnum & gt;范围-2)

{printf("迷宫太大解不开\ n ");

返回;

}//判断迷宫的大小是否符合要求。

//初始化迷宫变量

MazeType迷宫;

for(I = 0;我& lt= rnum+1;i++)

for(int j = 0;j & lt= cnum+1;j++)

maze . arr[I][j]= ' # ';

CreatMaze(迷宫、rnum、cnum、FP);//创建一个迷宫

fclose(FP);//关闭迷宫文件

//打印当前迷宫

Printf("当前迷宫是:\ n ");

for(I = 0;我& lt= rnum+1;i++)

{ for(int j = 0;j & lt= cnum+1;j++)

printf("%c ",maze . arr[I][j]);

printf(" \ n ");

}

Printf("其中' # '代表障碍物,外圈' # '是栅栏\ n ");

//读取入口和出口位置。

PosType startp,endp

Printf("请输入入口位置(两个数用逗号隔开):");

scanf("%d,%d ",& ampstartp . I & amp;startp . j);

Printf("请输入退出位置(两个数字用逗号隔开):");

scanf("%d,%d ",& ampendp . I & amp;endp . j);

if(MazePath(maze,startp,endp))

{ PrintMaze(maze,rnum,cnum);//将解出来的迷宫输出到一个文件中保存并打印到屏幕上。

print stack();//如果路径存在,打印该路径。

}

Else printf("此迷宫中不存在路径\ n ");

}//main

//Mazeoperation.cpp

布尔通行证(迷宫式迷宫,PosType curpos)

{//判断当前位置是否可达,并返回值。

switch(char ch = maze . arr[curpos . I][curpos . j])

{ case ' ':return(FALSE);

案例' # ':

案例“@”:

case ' * ':return(true);

默认值:{printf("迷宫中第%d行第%d列的未知字符%c\n ",

curpos.i,curpos.j,ch);退出(0);}

}//开关

}//通过

空足迹(MazeType & amp迷宫,后置型curpos)

{

maze . arr[curpos . I][curpos . j]= ' * ';

}//足迹

void mark print(maze type & amp;迷宫,后置型curpos)

{

maze . arr[curpos . I][curpos . j]= ' @ ';

}//标记打印

void next pos(PosType & amp;curpos,int di)

{

开关(di)

{ case 1:curpos . j++;打破;

案例二:curpos . i++;打破;

案例三:curpos . j-;打破;

案例4:curpos . I-;打破;

默认值:printf("当前方向%d无效\n ",di);

退出(0);

}//开关

}//NextPos

bool maze path(maze type & amp;迷宫,后期开始,后期结束){

选择e型;

init stack(SqS);

PosType curpos = start

int cur step = 1;

做{

如果(!Pass(迷宫、curpos)){

足迹(迷宫、curpos);

e.order = curstep

e . seat . I = curpos . I;e . seat . j = curpos . j;

e . di = 1;

Push(SqS,e);

if(curpos . I = = end . I & amp;& ampcurpos . j = = end . j)return(TURE);

NextPos(curpos,1);

cur step++;

}//如果

否则{

如果(!StackEmpty(SqS)){

Pop(SqS,e);

while(e . di = = 4 & amp;& amp!StackEmpty(SqS)){

MarkPrint(迷宫,e . seat);Pop(SqS,e);

}//当

if(e . di & lt;4){

e . di++;Push(SqS,e);

NextPos(e座,e迪);

curpos . I = e . seat . I;curpos . j = e . seat . j;

}//如果

}//如果

}//否则

}while(!StackEmpty(SqS));

返回(假);

}//Mazepath

void CreatMaze(maze type & amp;maze,int row,int col,FILE *fp){

//建造一个迷宫

char ch = fgetc(FP);

for(int I = 1;我& lt=行;i++)

{

for(int j = 1;j & lt= colj++)

{switch( ch = fgetc(fp))

{

case“0”:maze . arr[I][j]=“”;打破;

case ' 1 ':maze . arr[I][j]= ' # ';打破;

默认值:printf("迷宫行%d和列%d的数据错误为%c ",I,j,ch);退出(0);

}//开关

}//for

fseek(fp,2,1);

}//for

fclose(FP);

}//CreatMaze

void PrintMaze(MazeType maze,int row,int col)

{//打印结果并输出到文件中保存。

文件* out

if((out = fopen("outfile "," w"))==NULL)

{printf("无法打开文件\ n ");

退出(0);

}//如果

for(int I = 0;我& lt= row+1;i++)

{ for(int j = 0;j & lt= col+1;j++)

{ fputc(maze.arr[i][j],out);

printf("%c ",maze . arr[I][j]);

}

printf(" \ n ");

}

Printf("其中' * '代表路径,' # '代表障碍,' @ '代表死胡同\ n ");

fclose(out);//关闭文件

}

//Basetype.h

# include & ltstdio.h & gt

#包含" stdlib.h "

# definer 30//堆栈存储空间的初始分配,

//以及用于存储迷宫的字符数组的最大维度。

#定义TURE 1

#定义假0

#定义OK 1

#定义错误0

#定义溢出-1

#define STACKINCREMENT 5 //堆栈的存储空间分配增量

typedef结构{

int I;//线坐标

int j;//列坐标

} PosType//迷宫中坐标位置的类型

//堆栈的定义

typedef结构{

int顺序;//通道块在路径上的方向

后置式座椅;//迷宫中通道块的“坐标位置”

int di//“方向”从这个通道块到下一个通道块

} SElemType//堆栈的元素类型

typedef结构{

SElemType * base//底部指针

SElemType * top//栈顶指针

int stacksize//当前分配的存储空间,以元素为单位。

} SqStack

//迷宫的定义

typedef结构{

int m,n;

char arr[范围][范围];

} MazeType

typedef int状态;

SqStack SqS//定义一个堆栈