zoukankan      html  css  js  c++  java
  • HDU 1242 Rescue

    题意:迷宫搜索,一个起点可能有多个终点,遇到门卫要额外花费一个单位时间;

    思路:bfs;

    结构体表示队列:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,s1,s2,e1,e2;
    char mm[505][505];
    int vis[505][505];
    int shortest[505][505];
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    struct node
    {
        int x,y;
        node(){}
        node(int x,int y)
        {
            this->x=x;
            this->y=y;
        }
    }q[500010];
    int bfs()
    {
        int b=0,e=0;
        q[e++]=node(s1,s2);
        vis[s1][s2]=1;
        shortest[s1][s2]=1;
        while(b<e)
        {
            node now=q[b++];
            for(int i=0;i<4;i++)
            {
                int xx=now.x+dir[i][0];
                int yy=now.y+dir[i][1];
                if(xx<0||xx>=n||yy<0||yy>=m||vis[xx][yy]||mm[xx][yy]=='#') continue;
                if(mm[xx][yy]=='r')
                {
                    return shortest[now.x][now.y];
                }        
                vis[xx][yy]=1;
                shortest[xx][yy]=shortest[now.x][now.y]+1;    
                if(mm[xx][yy]=='x')
                {
                    shortest[xx][yy]++;
                }
                q[e++]=node(xx,yy);
            }
        }
        return -1;
    }
    int main()
    {
        int i,j,k,ans;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(mm,0,sizeof(mm));
            memset(vis,0,sizeof(vis));
            memset(shortest,0,sizeof(shortest));
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    scanf(" %c",&mm[i][j]);
                    if(mm[i][j]=='a')
                    {
                        s1=i;s2=j;
                    }
                }
            }
            ans=bfs();
            if(ans==-1) printf("Poor ANGEL has to stay in the prison all his life.
    ");
            else printf("%d
    ",ans);
        }
    }

    stl普通队列:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n,m,s1,s2,e1,e2;
    char mm[505][505];
    int vis[505][505];
    int shortest[505][505];
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    struct node
    {
        int x,y;
    };
    queue<node> q;
    int bfs()
    {
        int b=0,e=0;
        while(!q.empty()) q.pop();
        node s;
        s.x=s1,s.y=s2;
        q.push(s);
        vis[s1][s2]=1;
        shortest[s1][s2]=1;
        while(!q.empty())
        {
            node now=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                int xx=now.x+dir[i][0];
                int yy=now.y+dir[i][1];
                if(xx<0||xx>=n||yy<0||yy>=m||vis[xx][yy]||mm[xx][yy]=='#') continue;
                if(mm[xx][yy]=='r')
                {
                    return shortest[now.x][now.y];
                }        
                vis[xx][yy]=1;
                shortest[xx][yy]=shortest[now.x][now.y]+1;    
                if(mm[xx][yy]=='x')
                {
                    shortest[xx][yy]++;
                }
                node d;
                d.x=xx;d.y=yy;
                q.push(d);
            }
        }
        return -1;
    }
    int main()
    {
        int i,j,k,ans;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(mm,0,sizeof(mm));
            memset(vis,0,sizeof(vis));
            memset(shortest,0,sizeof(shortest));
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    scanf(" %c",&mm[i][j]);
                    if(mm[i][j]=='a')
                    {
                        s1=i;s2=j;
                    }
                }
            }
            ans=bfs();
            if(ans==-1) printf("Poor ANGEL has to stay in the prison all his life.
    ");
            else printf("%d
    ",ans);
        }
    }

     优先队列:

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    using namespace std;
    int n,m,s1,s2;
    char mm[505][505];
    int vis[505][505];
    int  dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    struct node
    {
        int x,y,t;
        bool operator<(const node&xx)const
        {
            return t>xx.t;
        }
    };
    int bfs()
    {
        priority_queue<node>q;
        vis[s1][s2]=1;
        node cur,now;
        node s;
        s.x=s1;s.y=s2;s.t=0;
        q.push(s);
        while(!q.empty())
        {
            cur=q.top();
            q.pop();
            for(int i=0;i<4;i++)
            {
                now.x=cur.x+dir[i][0];
                now.y=cur.y+dir[i][1];
                now.t=cur.t+1;
                if(now.x<0||now.x>=n||now.y<0||now.y>=m||vis[now.x][now.y]||mm[now.x][now.y]=='#') continue;
                if(mm[now.x][now.y]=='r') return now.t;
                if(mm[now.x][now.y]=='x')
                {
                    now.t++;
                }
                vis[now.x][now.y]=1;
                q.push(now);
            }
        }
        return -1;
    }
    int main()
    {
        int i,j,k,ans;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(mm,0,sizeof(mm));
            memset(vis,0,sizeof(vis));
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    scanf(" %c",&mm[i][j]);
                    if(mm[i][j]=='a')
                    {
                        s1=i;s2=j;
                    }
                }
            }
            ans=bfs();
            if(ans==-1) printf("Poor ANGEL has to stay in the prison all his life.
    ");
            else printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    PBOC规范研究之九---静态数据认证(转)
    PBOC规范研究之五、安全相关的PKI基础知识(转)
    PBOC规范研究之三、TypeB协议(转)
    PBOC规范研究之二、PBOC规范中,对于通讯速率的约定(转)
    PBOC规范研究之一、ISO14443协议和PBOC关于CID的约定(转)
    qml js
    qml 信号与信号 信号与方法链接使用 带参数会报错
    调试bug的几种方法
    CDN方式使用iview
    iView--3
  • 原文地址:https://www.cnblogs.com/dashuzhilin/p/4470636.html
Copyright © 2011-2022 走看看