栈-迷宫求解路径问题
来源:互联网 发布:淘宝网店计划书ppt 编辑:程序博客网 时间:2024/04/20 07:42
//迷宫问题,暴力求解#include"stdio.h"#include"Stack.c"#define MAX_SIZE 100 //迷宫最大规格是100x100int MG[MAX_SIZE][MAX_SIZE] ;//1代表通,0代表不通typedef struct Mnode { int up ,down ,left , right ; int pass ;//是否经过}Mnode ;Status Search_Road ( Stack *s , int width , int height ,point start , point end);//寻找路径函数,找到返回TRUEint main (){ Stack s ; Stack out; int w,h ; int i , j; point start ; point end ; if( Init_Stack(&s)){ printf("Input migong canshu :\n") ; scanf("%d %d" ,&w , &h) ; // printf("%d %d \n",w,h); printf("input road ,0 is not able,1 is not able \n"); for ( i = 0 ; i < w ; i ++){ for ( j = 0 ; j < h ; j++ ){ scanf("%d", &MG[i][j]) ; } } start.x = 1 , start.y =1 ,end.x = w-2,end.y = h-2 ; if (Search_Road(&s,w,h,start,end)){ Init_Stack(&out) ; point p; while (!IsEmpty(&s)){ //point p; p = Pop(&s) ; Push(&out,p) ; } p = Pop(&out) ; printf("[%d , %d]",p.x,p.y); while (!IsEmpty(&out)){ // point p ; p = Pop(&out) ; printf("--> [%d , %d]",p.x,p.y); } }else{ printf("No Way !\n"); } }}void Clear(Mnode *m){ m->down = 0; m->left = 0; m->right = 0; m->up = 0; m->pass = 0 ;}Status Search_Road ( Stack *s , int width , int height ,point start , point end){ int i = 0 , j = 0 ; point p = start ; Mnode m[MAX_SIZE][MAX_SIZE] ;//保存上一个位置的探索方向 Clear(&m[p.x][p.y]); for ( i ; i <height ; i++) for ( j ; j <width ; j ++ ){ Clear(&m[i][j]); } do { //printf(" To point %d %d \n", p.x,p.y); if (MG[p.x][p.y] == 1&& m[p.x][p.y].pass == 0 ){//如果此位置可以通过,并且没有走过 Push(s , p );//该位置进栈 if ( p.x == end.x && p.y == end.y ){ //如果该点是终点,结束 return TRUE ; } m[p.x][p.y].pass = 1 ; //切换当前位置的东邻方块为新的位置 p.y ++ ; // Clear(&m[p.x][p.y-1]); m[p.x][p.y-1].right=1; } else{ p = GetTop(s); if ( m[p.x][p.y].up !=1 ){//如果栈顶位置有其他位置没有探索,顺时针寻找栈顶位置的下一个相邻块 if(m[p.x][p.y].left == 1 ){ //printf("Up\n"); if ( m[p.x-1][p.y].down == 1)//如果该位置的上面位置已经向下走过,则该位置不能向下走,即不能向后退 { m[p.x][p.y].up = 1 ; } else{ m[p.x][p.y].up = 1 ; p.x -- ; } }else if ( m[p.x][p.y].down == 1 ){ // printf("left\n"); if ( m[p.x][p.y-1].right == 1){ m[p.x][p.y].left = 1 ; }else{ m[p.x][p.y].left = 1 ; p.y -- ; } }else if ( m[p.x][p.y].right == 1 ){ // printf("Down\n"); if ( m[p.x+1][p.y].up == 1 ){ m[p.x][p.y].down =1 ; }else { m[p.x][p.y].down =1 ; p.x ++ ; } } }else{//如果栈不空,但栈顶四周都不通 p = GetTop(s); m[p.x][p.y].pass = 0 ; Pop(s) ; p = GetTop(s); } } }while ( ! IsEmpty(s) );//如果栈空,证明没有路到终点 return FALSE;}
利用栈的特性,进行求解迷宫从入口到出口的路径
下为迷宫
求解思路如下
代码如如上
其中栈的实现如下
#include"head.h"
#include<stdio.h>
#include<malloc.h>
#include<malloc.h>
#define elemtype point
#define INIT_STACK 100
#define INCREASEMENT_STACK 10
#define INIT_STACK 100
#define INCREASEMENT_STACK 10
typedef struct point{
int x ;
int y ;
int y ;
}point;
typedef struct Stack{
elemtype *base , *top ;//栈底和栈顶指针
int size_stack ;//栈大小
}Stack ;
Status Init_Stack (Stack *s);//初始化栈
Status IsEmpty (Stack *s);//判断栈是否为空
Status Push (Stack *s, elemtype e);//进栈
elemtype GetTop (Stack *s );//得到栈顶元素
elemtype Pop(Stack *s );//出栈
Status Clear_Stack(Stack *s);//清空栈
Status Destroy_Stack (Stack *s);//销毁栈
//int main (){
//
// Stack s ;
// int i ;
// Init_Stack (&s) ;
// if (IsEmpty(&s))
// printf("empty\n") ;
//
// for ( i = 0; i < 110 ; i ++){
//
// Push(&s , i) ;
// }
// if (!IsEmpty(&s))
// printf("! empty\n") ;
// printf ("%d" , Pop(&s) );
//
// Clear_Stack(&s) ;
// Destroy_Stack(&s) ;
//}
Status Init_Stack (Stack *s){
//
// Stack s ;
// int i ;
// Init_Stack (&s) ;
// if (IsEmpty(&s))
// printf("empty\n") ;
//
// for ( i = 0; i < 110 ; i ++){
//
// Push(&s , i) ;
// }
// if (!IsEmpty(&s))
// printf("! empty\n") ;
// printf ("%d" , Pop(&s) );
//
// Clear_Stack(&s) ;
// Destroy_Stack(&s) ;
//}
Status Init_Stack (Stack *s){
s->base = (elemtype *) malloc (INIT_STACK * sizeof(elemtype)); //分配空间
if (s->base == NULL) {
exit(-1) ;
}
s->top = s->base ;
s->size_stack = INIT_STACK ;
}
s->top = s->base ;
s->size_stack = INIT_STACK ;
}
Status IsEmpty (Stack *s){
if (s->base != NULL)
return (s->base == s->top) ;
else
return ERROR ;
return (s->base == s->top) ;
else
return ERROR ;
}
Status Push (Stack *s, elemtype e){
Status Push (Stack *s, elemtype e){
if (s->base == NULL)
return ERROR ;
return ERROR ;
if ((s->top )- (s->base) >=( s->size_stack)){//如果栈满
s->base = (elemtype *)realloc (s->base , ((s->size_stack)+INCREASEMENT_STACK)*sizeof(elemtype));
s->top = s->base + s->size_stack ;
s->size_stack += INCREASEMENT_STACK ;
s->top = s->base + s->size_stack ;
s->size_stack += INCREASEMENT_STACK ;
}
*(s->top++) = e ;
// s->top++;
return OK;
*(s->top++) = e ;
// s->top++;
return OK;
}
elemtype GetTop (Stack *s ){
if ( !IsEmpty( s )){
return *(s->top-1) ;
}
printf("error : Stack Is Empty \n");
}
printf("error : Stack Is Empty \n");
}
elemtype Pop(Stack *s ){
if (IsEmpty(s))
{
printf ("Stack Is Empty !") ;
}
return *(--s->top);
{
printf ("Stack Is Empty !") ;
}
return *(--s->top);
}
Status Clear_Stack(Stack *s){
Status Clear_Stack(Stack *s){
s->top = s->base ;
return OK;
return OK;
}
Status Destroy_Stack (Stack *s){
Status Destroy_Stack (Stack *s){
free(s->base) ;
}
输入测试用例如下
0 0
- 栈-迷宫求解路径问题
- 栈求解迷宫问题
- 栈求解迷宫问题
- [数据结构]求解迷宫最短路径问题
- 关于栈与递归求解迷宫与迷宫最短路径问题
- 用栈求解迷宫问题 ~~
- 栈实现迷宫求解问题
- 利用栈求解迷宫问题
- 数据结构-迷宫求解路径
- 迷宫求解最优路径
- 栈—迷宫求解(求解所有可通过路径)
- AStar算法求解迷宫最短路径问题
- 蚁群算法求解迷宫最优路径问题
- 队列应用2:求解迷宫问题,最短路径
- 迷宫求解最短路径问题java版
- 数据结构:栈和队列-迷宫问题求解
- 基于栈操作的迷宫问题求解
- 利用数据结构栈求解迷宫问题
- Dubbo-Admin管理平台和Zookeeper注册中心的搭建
- JVM虚拟机堆内存大小
- 关于shell变量的第一个shell脚本
- Android应用程序组件(三)
- 关于mysql的procedure的一些细节
- 栈-迷宫求解路径问题
- asp.net给DropDownList添加ToolTip(title)属性
- LeetCode - Longest SubString without repeating characters_003
- Codeforces Round #313 (Div. 2) C. Gerald's Hexagon
- 周赛 大数找规律
- HDOJ--1719--Friend
- C# Winform中实现主窗口打开登录窗口关闭的方法
- crontab每月最后一天执行
- C#在C++编写的DLL中注册函数并回调