zoukankan      html  css  js  c++  java
  • 广搜_优先队列和记录搜索路径(HDU_1026)

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #include <stack>
    
    using namespace std;
    
    #define M    105
    
    typedef struct Node{
        int row,col,step,f_row,f_col,count;
    
        friend bool operator < (const Node a,const Node b)
        {
            return a.step>b.step;
        }
    } Node;
    
    const int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    char map[M][M];
    int n,m,sum;
    
    priority_queue<Node> Q;
    queue<Node> __Q;
    stack<Node> S,__S;
    
    void __clear()
    {
        while(!Q.empty())    Q.pop();
        while(!S.empty())    S.pop();
        while(!__Q.empty())    __Q.pop();
        while(!__S.empty())    __S.pop();
    }
    
    int jud(Node temp)
    {
        if(temp.row>=0 && temp.row<n && temp.col>=0 && temp.col<m && map[temp.row][temp.col]!='X')    return 1;
        return 0;
    }
    
    void bfs()
    {
        __clear();
        Node temp,add;
        temp.row=temp.col=temp.step=0;
        temp.f_row=temp.f_col=-1;
        temp.count=0;
        map[temp.row][temp.col]='X';
        Q.push(temp);
        while(!Q.empty())
        {
            temp=Q.top();
            Q.pop();
            __Q.push(temp);
            if(temp.row==n-1 && temp.col==m-1)
            {
                sum=temp.step;
                return ;
            }
            for(int i=0;i<4;i++)
            {
                add.row=temp.row+move[i][0];
                add.col=temp.col+move[i][1];
                add.f_row=temp.row;
                add.f_col=temp.col;
                if(!jud(add))    continue;
                add.step=temp.step+1;
                add.count=0;
                if(map[add.row][add.col]!='.')
                {
                    add.step=add.step+map[add.row][add.col]-'0';
                    add.count=map[add.row][add.col]-'0';
                }
                map[add.row][add.col]='X';
                Q.push(add);
            }
        }
    }
    
    void show_path()
    {
        while(!__Q.empty())
        {
            S.push(__Q.front());
            __Q.pop();
        }
    
        int __f_row=S.top().row;
        int __f_col=S.top().col;
        while(!S.empty())
        {
            Node temp=S.top();
            S.pop();
            if(!(__f_row ==temp.row && __f_col ==temp.col))    continue;
            __f_row=temp.f_row;
            __f_col=temp.f_col;
            __S.push(temp);
        }
    
        int i=1;
        if(sum)    printf("It takes %d seconds to reach the target position, let me show you the way.\n",sum);
        else
        {
            printf("God please help our poor hero.\nFINISH\n");
            return ;
        }
        while(!__S.empty())
        {
            Node temp=__S.top();
            __S.pop();
            if(temp.f_row==-1 && temp.f_col==-1)    continue;
            printf("%ds:(%d,%d)->(%d,%d)\n",i++,temp.f_row,temp.f_col,temp.row,temp.col);
            if(temp.count)    while(temp.count--)    printf("%ds:FIGHT AT (%d,%d)\n",i++,temp.row,temp.col);
    //        printf("row=%d,col=%d,step=%d,f_row=%d,f_col=%d\n",temp.row,temp.col,temp.step,temp.f_row,temp.f_col);
        }    
        printf("FINISH\n");
    }
    
    int main(int argc, char *argv[])
    {
        #ifdef __LOCAL
        freopen("in.txt","r",stdin);
        #endif
    
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=0;i<n;i++)
                scanf("%s",map[i]);
            sum=0;
            bfs();
            show_path();
        }
        return 0;
    }
  • 相关阅读:
    HDU5213(容斥定理+莫队算法)
    HDU4467:Graph(点的度数分块)
    BZOJ3834:Solar Panels (分块)
    BZOJ2217:Lollipop
    “玲珑杯”线上赛 Round #17 河南专场 B:震惊,99%+的中国人都会算错的问题(容斥计算)
    Linux环境及基础命令(一)
    阿里前CEO卫哲:马云好玩,人工智能泡沫巨大,新零售重在社区
    配置JDK和Tomcat环境变量
    批处理_批量替换不同语句
    批处理命令_提取当前目录下所有文件名称
  • 原文地址:https://www.cnblogs.com/lk1993/p/3034334.html
Copyright © 2011-2022 走看看