栈-迷宫求解路径问题

来源:互联网 发布:淘宝网店计划书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>

#define elemtype point
#define INIT_STACK 100
#define INCREASEMENT_STACK 10

typedef struct point{

   int x ;
   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){

 s->base = (elemtype *) malloc (INIT_STACK * sizeof(elemtype)); //分配空间

 if (s->base == NULL) {

    exit(-1) ;
 }
  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 ;

}
Status Push (Stack *s, elemtype e){

    if (s->base == NULL)
        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++) = e ;
     // s->top++;
      return OK;

}

elemtype GetTop (Stack *s ){

    if ( !IsEmpty( s )){

        return *(s->top-1) ;
    }
    printf("error : Stack Is Empty \n");

}

elemtype Pop(Stack *s ){

      if (IsEmpty(s))
      {
          printf ("Stack Is Empty !") ;
      }
      return *(--s->top);

}
Status Clear_Stack(Stack *s){

      s->top = s->base ;
      return OK;

}
Status Destroy_Stack (Stack *s){

   free(s->base) ;

}



输入测试用例如下




0 0
原创粉丝点击