数据结构(C++) 栈-迷宫问题
来源:互联网 发布:库里2017总决赛数据 编辑:程序博客网 时间:2024/05/23 01:56
/*本函数二维坐标从0开始*/#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1#define INFEASIBLE -2#define COL 10#define ROW 10typedef struct { int row; int col;}POS;typedef struct { POS pos; int come; int leave;}Maze;typedef struct { Maze *base; Maze *top; int stacksize;}SqStack;void SqStack_Init(SqStack &S){ S.base=(Maze *)malloc(STACK_INIT_SIZE*sizeof(Maze));//申请空间并判断是否成功 if(!S.base) exit(INFEASIBLE); S.top=S.base;//设置为空栈 S.stacksize=STACK_INIT_SIZE;//设置栈的大小}//初始化栈void SqStack_Push(SqStack &S,Maze Elem){ if(S.top-S.base>=S.stacksize)//判断时候超过当前的栈的大小 { S.base=(Maze *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(Maze));//重新申请空间并判断是否成功 if(!S.base) exit(INFEASIBLE); S.top=S.base+S.stacksize;//更改栈顶地址 S.stacksize+=STACKINCREMENT;//更改栈的大小 } *S.top++=Elem;//赋值入栈}//入栈int SqStack_Pop(SqStack &S,Maze &Elem){ if(S.base==S.top)//判断是否为空栈 return ERROR; Elem=*--S.top;//赋值返回 return OK;}//出栈int SqStack_Gettop(SqStack &S,Maze &Elem){ if(S.base==S.top)//判断是否为空栈 return ERROR; Elem=*(S.top-1);//赋值返回 return OK;}int SqStack_Show(SqStack &S){ Maze *Base=S.base;//把栈底地址赋值给另外一个地址 if(S.base==S.top)//判断是否为空栈 return ERROR; while(Base!=S.top)//当地址等于栈顶地址时结束遍历 { printf("(%d,%d)->",Base->pos.row,Base->pos.col);//输出 Base++;//地址移位 } printf("\b\b \n"); return OK;}//输出栈int Maze_Arr_i(int Maze_Arr[][10],Maze cur,int i){ switch(i)//返回对应方向的迷宫值 { case 1: return Maze_Arr[cur.pos.row][cur.pos.col+1]; break; case 2: return Maze_Arr[cur.pos.row+1][cur.pos.col]; break; case 3: return Maze_Arr[cur.pos.row][cur.pos.col-1]; break; case 4: return Maze_Arr[cur.pos.row-1][cur.pos.col]; break; }}//cur的i方位的地址的值int Next_come(int leave){ switch(leave) { case 1: return 3; break; case 2: return 4; break; case 3: return 1; break; case 4: return 2; break; }}//next位置的来向come由cur的去向leave决定void Next_pos(Maze cur,Maze &next){ switch(next.come) { case 1: next.pos.row=cur.pos.row; next.pos.col=cur.pos.col-1; break; case 2: next.pos.row=cur.pos.row-1; next.pos.col=cur.pos.col; break; case 3: next.pos.row=cur.pos.row; next.pos.col=cur.pos.col+1; break; case 4: next.pos.row=cur.pos.row+1; next.pos.col=cur.pos.col; break; }}//next的pos由next的come向和cur的pos决定/* 0表示可走方块,1表示不可走方块方位示意图: 4 3 * 1 2走迷宫时,先从1方位开始,依次到4方位 当一个点三个方位都是不可走方块,并且为非终点、非起点时,走过该点时,退出后将该点标1*/int Next(int Maze_Arr[][COL],Maze &cur,Maze &next){ int i; if(cur.leave%4+1==cur.come)//判断下一方向是不是最开始来向 { Maze_Arr[cur.pos.row][cur.pos.col]=1;//修改迷宫 return ERROR;//死路 } i=cur.leave%4+1;//转换方向 while(Maze_Arr_i(Maze_Arr,cur,i))//判断该方向是否可通 { i=i%4+1;//转换方向 if(i==cur.come)//判断该方向是不是最开始来向 { Maze_Arr[cur.pos.row][cur.pos.col]=1;//修改迷宫 return ERROR;//死路 } } cur.leave=i;//标记当前去向 next.come=Next_come(cur.leave);//求next来向 Next_pos(cur,next);//求next的坐标 return OK;}//寻求cur位置的next位置int SqStack_Search(SqStack &S,Maze next){ Maze *Base=S.base;//把栈底地址赋值给另外一个地址 if(S.base==S.top)//判断是否为空栈 return OK;//没出现 while(Base!=S.top)//当地址等于栈顶地址时结束遍历 { if(Base->pos.row==next.pos.row&&Base->pos.col==next.pos.col) return ERROR;//曾经经过该点 Base++;//地址移位 } return OK;}//查找next位置是否走过int Maze_Run(int Maze_Arr[][COL],POS begin,POS end){ int i=1,State1,State2; Maze cur,next; SqStack S; SqStack_Init(S);//初始化栈 cur.pos.row=begin.row; cur.pos.col=begin.col;//将当前点设置为起点 cur.come=1; while(Maze_Arr_i(Maze_Arr,cur,i)) { i++; if(i==5) return ERROR; }//遍历直至当前点有出口 cur.leave=i;//标记去向 SqStack_Push(S,cur);//将当前点入栈 next.come=Next_come(cur.leave);//求next的来向 Next_pos(cur,next);//求next的坐标 while(1) { next.come=Next_come(cur.leave);//求next的来向 next.leave=next.come;//求初始化next的去向 cur=next;//移动位置 if(cur.pos.row==end.row&&cur.pos.col==end.col)//判断是否到达终点 { SqStack_Push(S,cur); break; } State1=Next(Maze_Arr,cur,next); //求next State2=SqStack_Search(S,next);//已过路径判断next是否是 while(State1==ERROR||State2==ERROR) { State1=SqStack_Pop(S,cur);//出栈 if(State1==ERROR) return ERROR; State1=Next(Maze_Arr,cur,next);//求next State2=SqStack_Search(S,next);//判断next是否为已过路径 } SqStack_Push(S,cur); //入栈 } printf("找到路径:\n"); State1=SqStack_Show(S);//输出路径 return OK;}//走迷宫int main(){ //预置迷宫 int Maze_Arr[ROW][COL]={{1,1,1,1,1,1,1,1,1,1},{1,1,1,1,0,0,0,0,0,1},{1,1,0,0,0,1,0,0,0,1},{1,1,0,0,0,1,0,1,0,1},{1,1,0,0,0,1,0,1,0,1},{1,1,1,1,1,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,1},{1,0,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}}; int State,i,j; for(i=0;i<ROW;i++) { for(j=0;j<COL;j++) printf("%d ",Maze_Arr[i][j]); printf("\n"); }//输出迷宫 POS begin,end; begin.row=3; begin.col=3; end.row=8; end.col=8; printf("起点->终点:(%d,%d)->(%d,%d)\n",begin.row,begin.col,end.row,end.col);/* printf("请输入迷宫!\n"); for(i=0;i<ROW;i++) for(j=0;j<COL;j++) scanf("%d",&Maze_Arr[i][j]); printf("请输入迷宫起点:"); scanf("%d%d",&begin.row,&begin.col); printf("请输入迷宫终点:"); scanf("%d%d",&end.row,&end.col); */ State=Maze_Run(Maze_Arr,begin,end); if(State==ERROR) printf("找不到出路!\n"); return 0;}
阅读全文
0 0
- 数据结构(C++) 栈-迷宫问题
- 数据结构-栈/c++/迷宫
- 数据结构 C语言 双向链栈 迷宫问题
- 数据结构 C语言 队列 迷宫问题
- 数据结构:栈和队列-迷宫问题求解
- <数据结构>栈的应用三:迷宫问题
- 利用数据结构栈求解迷宫问题
- 栈的应用-迷宫问题-数据结构
- 【数据结构】使用栈Stack解决迷宫问题
- 【数据结构】栈实现迷宫寻路问题
- 数据结构-顺序栈解决迷宫问题
- 数据结构之 栈应用---老鼠迷宫问题
- 数据结构迷宫问题
- 数据结构之迷宫问题
- 数据结构----迷宫问题
- 数据结构之迷宫问题
- 数据结构迷宫问题
- 数据结构--迷宫问题
- 日本公司开发出转化率破纪录太阳能电池,转化效率26%+
- 程序执行概述
- 01:搭建第一个springboot项目
- JZOJ 5430 图
- 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通 递推+动归
- 数据结构(C++) 栈-迷宫问题
- 平衡二叉树的旋转
- CentOS下的history命令
- 四场纯技术干货分享,就是这么任性 | 硬创公开课预告
- 谷歌地图推出位置实时分享功能,注重用户隐私保护
- 摩拜“红包车”表面是烧钱 实际省了一笔巨额运营费
- 微信上线“微信指数”,进一步拓展微信生态
- 2017.10.27工作日记
- 苹果收购自动化应用Workflow,会是为了Siri吗?