真心求用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//定义一个堆栈