• BFS


    hdu 1180 诡异的楼梯

    #include<cstdio>
    #include <iostream>
    using namespace std;
    #include<algorithm>
    #include <queue>
    #include <cstring>
    using namespace std;
    
    const int N = 50;
    const int INF = 1e6;
    char Map[N][N];
    bool vis[N][N];
    int n,m;
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    
    struct node{
        int x,y;
        int step;
        friend bool operator < (const node &a,const node &b)
        {
            return a.step>b.step;
        }
    };
    node st;
    bool check(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<m&&!vis[x][y]&&Map[x][y]!='*')
            return true;
        else
            return false;
    
    }
    int bfs(int x,int y)
    {
        char c;
        priority_queue<node> q;
        node s_pos;
        s_pos.x = x;
        s_pos.y = y;
        s_pos.step  = 0;
        vis[s_pos.x][s_pos.y]=1;
        q.push(s_pos);
        while(!q.empty()){
            node tmp = q.top();
            q.pop();
            for(int i=0;i<4;i++)
            {
                node tmp2 ;
                tmp2 = tmp;
                tmp2.x += dir[i][0];
                tmp2.y += dir[i][1];
                tmp2.step += 1;
                if(check(tmp2.x,tmp2.y)&&(Map[tmp2.x][tmp2.y]=='-'||Map[tmp2.x][tmp2.y]=='|')){
                    if(tmp2.step % 2 == 1){
                        if(Map[tmp2.x][tmp2.y] == '-') c = '|';
                        else if(Map[tmp2.x][tmp2.y]=='|') c = '-';
                    }else c = Map[tmp2.x][tmp2.y];
                    tmp2.x += dir[i][0];
                    tmp2.y += dir[i][1];
                    if((c =='-'&&(dir[i][1]==-1||dir[i][1]==1))||(c =='|'&&(dir[i][0]==-1||dir[i][0]==1)))
                        tmp2.step += 1;//判断是否需要时间来等待楼梯
                }
                if(check(tmp2.x,tmp2.y)){
                    if(Map[tmp2.x][tmp2.y]=='T') return tmp2.step;
                    vis[tmp2.x][tmp2.y] = 1;
                    q.push(tmp2);
                }
            }
        }
    }
    int main()
    {
        while(cin>>n>>m)
        {
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    cin>>Map[i][j];
                    if(Map[i][j]=='S'){
                        st.x=i;
                        st.y=j;
                    }
                }
            }
            memset(vis,0,sizeof(vis));
            int ans = bfs(st.x,st.y);
            printf("%d
    ",ans);
        }
       return 0;
    }
    
  • 相关阅读:
    《Head First》 MVC运用的设计模式
    unity工具 Animator的使用
    服务器搭建 如果搭建KBE开源服务器
    unity 实战图片挖洞Mask(转载)
    unity博客 推荐(不断补充)
    unity实战 UGUI英雄联盟英雄头顶分段式血条
    unity组成 ToLua
    unity实战 UGUI Text 间距和ContentSizeFitter组件的适配
    unity工具 推荐(不断补充)
    各种单例模式的对比分析
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160148.html
Copyright © 2020-2023  润新知