zoukankan      html  css  js  c++  java
  • 迷宫寻路

    #include<stdio.h>
    #include<stdlib.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<=0) return ERROR;
    *e=S->elem[--S->top];return OK;
    }
    int Empty(Stack S)
    {
    if(S.top==0) return 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;
    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.y ][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);
    }
    }
    Live together,or Die alone!
  • 相关阅读:
    noip2016组合数问题
    noip2017奶酪
    洛谷1091合唱队形
    洛谷P1075 质因数分解
    洛谷1004方格取数
    POJ2393奶酪工厂
    NOIP2012国王游戏(60分题解)
    洛谷1106删数问题
    洛谷1209修理牛棚
    二维树状数组区间修改+区间查询模版
  • 原文地址:https://www.cnblogs.com/hzhida/p/2354756.html
Copyright © 2011-2022 走看看