• 迷宫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 
  • 相关阅读:
    枯燥的数据库“三级模式”
    SQL Server四个“系统数据库”作用的简介
    数据库的范式
    使用JMeter进行分布式性能测试
    使用JMeter测试你的EJB
    jmeter资源监控器开发——进入jmeter的源码世界
    如何解决使用JMeter时遇到的问题
    安装jmeter
    SMTP错误码/建议解决方法
    Jmeter接口测试 实例
  • 原文地址:https://www.cnblogs.com/13yan/p/2328384.html
Copyright © 2020-2023  润新知