C++实现迷宫代码

以下迷宫问题中有用到 栈的基本操作 请查看本博客其他文章————【栈的基本操作的实现】

//maze.cpp

#include "stack.cpp"

#define MAXLEN 10  //迷宫包括外墙最大行列数目

typedef struct{
 
 int r;
 
 int c;
 
 char adr[MAXLEN][MAXLEN];  //可取' ', '*' , '@' , '#'

}MazeType;   //迷宫类型

Status InitMaze(MazeType &maze){   //初始化迷宫,若成功返回TRUE,否则返回FALSE
 
 int m,n,i,j;
 
 printf("Enter row and column numbers: ");
 
 scanf("%d%d",&maze.r,&maze.c);   //迷宫行和列数
 
 for(i=0;i<=maze.c+1;i++){   //迷宫行外墙
  
  maze.adr[0][i]='#';
  
  maze.adr[maze.r+1][i]='#';
 
 }//for
 
 for(i=0;i<=maze.r+1;i++){   //迷宫列外墙
  
  maze.adr[i][0]='#';
  
  maze.adr[i][maze.c+1]='#';

 }
 
 for(i=1;i<=maze.r;i++)
  
  for(j=1;j<=maze.c;j++)
   
   maze.adr[i][j]=' ';   //初始化迷宫
 
 printf("Enter block's coordinate((-1,-1) to end): ");
 
 scanf("%d%d",&m,&n);   //接收障碍的坐标
 
 while(m!=-1){
  
  if(m>maze.r || n>maze.c)   //越界
   
   exit(ERROR);
  
  maze.adr[m][n]='#';   //迷宫障碍用'#'标记
  
  printf("Enter block's coordinate((-1,-1) to end): ");
  
  scanf("%d%d",&m,&n);
 
 }//while
 
 return OK;

}//InitMaze        

Status Pass(MazeType maze,PostType curpos){   //当前位置可通则返回TURE,否则返回FALSE
 
 if(maze.adr[curpos.r][curpos.c]==' ')   //可通
  
  return TRUE;

 else
  
  return FALSE;

}//Pass

Status FootPrint(MazeType &maze,PostType curpos){   //若走过并且可通返回TRUE,否则返回FALSE  //在返回之前销毁栈S
 
 maze.adr[curpos.r][curpos.c]='*';   //"*"表示可通
 
 return OK;

}//FootPrint

PostType NextPos(PostType &curpos,int i){  //指示并返回下一位置的坐标
 
 PostType cpos;
 
 cpos=curpos;
 
 switch(i){  //1,2,3,4分别表示东,南,西,北方向

case 1 : cpos.c+=1; break;

case 2 : cpos.r+=1; break;

case 3 : cpos.c-=1; break;

case 4 : cpos.r-=1; break;

default: exit(ERROR); 
 
 }
 
 return cpos;

}//Nextpos

Status MarkPrint(MazeType &maze,PostType curpos){  //曾走过但不是通路标记并返回OK
 
 maze.adr[curpos.r][curpos.c]='@';  //"@"表示曾走过但不通
 
 return OK;

}//MarkPrint

Status MazePath(MazeType &maze,PostType start,PostType end){  //若迷宫maze存在从入口start到end的通道,则求得一条存放在栈中,并返回TRUE,否则返回FALSE
 
 Stack S;
 
 PostType curpos;
 
 int curstep;   //当前序号,1,2,3,4分别表示东,南,西,北方向
 
 SElemType e;
 
 InitStack(S);
 
 curpos=start;  //设置"当前位置"为"入口位置"
 
 curstep=1;     //探索第一步
 
 do{
  
  if(Pass(maze,curpos)){  //当前位置可以通过,即是未曾走到过的通道
   
   FootPrint(maze,curpos);  //留下足迹
   
   e.ord=curstep;
   
   e.seat=curpos;
   
   e.di=1;

   Push(S,e);   //加入路径
   
   if(curpos.r==end.r&& curpos.c==end.c)
    
    if(!DestroyStack(S))  //销毁失败
     
     exit(OVERFLOW);
    
    else
     
     return TRUE;  //到达出口
   
   else{
    
    curpos=NextPos(curpos,1);   //下一位置是当前位置的东邻
    
    curstep++;   //探索下一步
   
   }//else
  
  }//if
  
  else{    //当前位置不通
   
   if(!StackEmpty(S)){
    
    Pop(S,e);
    
    while(e.di==4 && !StackEmpty(S)){
     
     MarkPrint(maze,e.seat);
     
     Pop(S,e);   //留下不能通过的标记,并退一步
    
    }//while
    
    if(e.di < 4){
     
     e.di++;  //换下一个方向探索
     
     Push(S,e);           
     
     curpos=NextPos(e.seat,e.di);   //设定当前位置是该新方向上的相邻
    
    }//if
   
   }//if

  }//else

 
 }while(!StackEmpty(S));
 
 if(!DestroyStack(S))  //销毁失败
  
  exit(OVERFLOW);            
 
 else
  
  return FALSE;

}//MazePath

void PrintMaze(MazeType &maze){  //将标记路径信息的迷宫输出到终端(包括外墙)
 
 int i,j;
 
 printf("/nShow maze path(*---pathway):/n/n");
 
 printf("  ");
 
 for(i=0;i<=maze.r+1;i++)  //打印列数名
  
  printf("%4d",i);
 
 printf("/n/n");
 
 for(i=0;i<=maze.r+1;i++){
  
  printf("%2d",i);  //打印行名
  
  for(j=0;j<=maze.c+1;j++)
   
   printf("%4c",maze.adr[i][j]);  //输出迷宫//当前位置的标记         
  
  printf("/n/n");
 
 }

}//PrintMaze

 

void main(){  //主函数
 
 MazeType maze;
 
 PostType start,end;
 
 char cmd;
 
 do{
  
  printf("-------FOUND A MAZEPATH--------/n");
  
  if(!InitMaze(maze)){  //初始化并创建迷宫
   
   printf("/nInitialization errors!!!/n");

   exit(OVERFLOW);  //初始化错误
  
  }
  
  do{    //输入迷宫入口坐标
   
   printf("/nEnter entrance coordinate of the maze: ");
   
   scanf("%d%d",&start.r,&start.c);
   
   if(start.r>maze.r || start.c>maze.c){
    
    printf("/nBeyond the maze!!!/n");
    
    continue;
   }
  
  }while(start.r>maze.r || start.c>maze.c);
  
  
  do{   //输入迷宫出口坐标
   
   printf("/nEnter exit coordinate of the maze: ");

   scanf("%d%d",&end.r,&end.c);

   if(end.r>maze.r || end.c>maze.c){

    printf("/nBeyond the maze!!!/n");

    continue;

   }


  }while(end.r>maze.r || end.c>maze.c);

  if(!MazePath(maze,start,end))   //迷宫求解
   
   printf("/nNo path from entrance to exit!/n");

  else
   
   PrintMaze(maze);  //打印路径

  printf("/nContinue?(y/n): ");
  
  scanf("%s",&cmd);
 
 }while(cmd=='y' || cmd=='Y');

}//main

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值