迷宫C描述——栈的举例

 
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 50
#define ERROR -1
#define OK 0
#define FALSE 0
#define TRUE 1

typedef  enum{RIGHT,DOWN,LEFT,UP} Direction;
typedef  enum{YES,NO} MarkTag;

typedef  struct position{
     int x;
     int y;
}Position;

typedef  struct{
     int order;
    Position seat;
    Direction di;
}SElemType;

typedef  struct{
    SElemType *elem;
     int top;
}Stack;

char maze[MAXSIZE+ 2][MAXSIZE+ 2];

int InitStack(Stack *S){
    S->elem=(SElemType *)malloc(MAXSIZE*MAXSIZE* sizeof(SElemType));
     if(!S->elem)  return ERROR;
    S->top= 0;
     return OK;
}

int Push(Stack *S,SElemType e){
     if(S->top>=MAXSIZE*MAXSIZE)  return ERROR;
    S->elem[S->top++]=e;
     return OK;
}

int Pop(Stack *S,SElemType *e){
     if(S->top<= 0return ERROR;
    *e=S->elem[--S->top];
     return OK;
}

int Empty(Stack S){
     if(S.top== 0return TRUE;
     return FALSE;
}

int createMaze( char *filename,Position *startpos,Position *endpos){
    FILE *fp;
     int i,j,rows,cols,temp;
    Position start,end;
    fp=fopen(filename, " r ");
     if(!fp){
        printf( " open file %s error!\n ",filename);
         return ERROR;
    }
     if(!feof(fp)){
        fscanf(fp, " %d %d  ",&rows,&cols);
        fscanf(fp, " %d %d  ",&start.x,&start.y);
        fscanf(fp, " %d %d  ",&end.x,&end.y);
    }
     for(i= 1;i<=rows;i++){
         for(j= 1;j<=cols;j++){
            fscanf(fp, " %d  ",&temp);
            maze[i][j]= 48+temp;
        }
    }
    fclose(fp);
    
     for(i= 0,j= 0;i<=rows+ 1;i++)maze[i][j]= ' 1 ';
     for(i= 0,j=cols+ 1;i<=rows+ 1;i++)maze[i][j]= ' 1 ';
     for(i= 0,j= 0;j<=cols+ 1;j++)maze[i][j]= ' 1 ';
     for(i=rows+ 1,j= 0;j<=cols+ 1;j++)maze[i][j]= ' 1 ';
    *startpos=start;
    *endpos=end;
    
     for (i= 0;i<=rows+ 1;i++)
    {
         for(j= 0;j<=cols+ 1;j++)
        {
            printf( " %c ",maze[i][j]);
        }
        printf( " \n ");
    }
     return OK;
}

int canPass(Position curpos){
     if(maze[curpos.x][curpos.y]== ' 0 'return TRUE;
     return FALSE;
}

void markPos(Position curpos,MarkTag tag){
     switch(tag){
         case YES:maze[curpos.x][curpos.y]= ' . '; break;
         case NO:maze[curpos.x][curpos.y]= ' # '; break;
    }
}

Position nextPos(Position curpos,Direction dir){
    Position nextpos;
     switch(dir){
         case RIGHT:nextpos.x=curpos.x;nextpos.y=curpos.y+ 1; break;
         case DOWN:nextpos.x=curpos.x+ 1;nextpos.y=curpos.y; break;
         case LEFT:nextpos.x=curpos.x;nextpos.y=curpos.y- 1; break;
         case UP:nextpos.x=curpos.x- 1;nextpos.y=curpos.y; break;
    }
     return nextpos;
}

Direction nextDir(Direction dir){
     switch(dir){
         case RIGHT: return DOWN;
         case DOWN: return LEFT;
         case LEFT: return UP;
    }
}

int Solve(Stack *S,Position start,Position end){
    Position curpos;
    SElemType e;
     int curstep= 1;
     if(InitStack(S)==ERROR)  return FALSE;
    curpos=start;
     do{
         if(canPass(curpos)){
            markPos(curpos,YES);
            e.order=curstep;e.seat=curpos;e.di=RIGHT;
            Push(S,e);
             if(curpos.x==end.x && curpos.y==end.y)
                 return TRUE;
            curpos=nextPos(curpos,RIGHT);
            curstep++;
        }
         else
        {
             if(!Empty(*S)){
                 if(Pop(S,&e)==ERROR)  return FALSE;
                 while(e.di==UP && !Empty(*S)){
                    curpos=e.seat;markPos(curpos,NO);
                     if(Pop(S,&e)==ERROR) return FALSE;
                }
                 if(e.di!=UP){
                    e.di=nextDir(e.di);
                    Push(S,e);
                    curpos=nextPos(e.seat,e.di);
                }
            }
        }
    } while(!Empty(*S));
     return FALSE;
}

void main( void)
{
    Position startPos,endPos;
    Stack path;
    SElemType e;
     char *fname= " in.txt ";
     if(createMaze(fname,&startPos,&endPos)==ERROR)  return;
    Solve(&path,startPos,endPos);
     while(!Empty(path)){
        Pop(&path,&e);
        printf( " (%d,%d)\n ",e.seat.x,e.seat.y);
    }
    system( " pause ");
}
 
in.txt
8 8  
1 1 8 8 
0 0 1 0 0 0 1 0 
0 0 1 0 0 0 1 0 
0 0 0 0 1 1 0 0 
0 1 1 1 0 0 0 0 
0 0 0 1 0 0 0 0 
0 1 0 0 0 1 0 0 
0 1 1 1 0 1 1 0 
1 0 0 0 0 0 0 0 

你可能感兴趣的:(迷宫)