迷宫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 
复制代码
posted @   十三燕  阅读(388)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示