zoukankan      html  css  js  c++  java
  • Rescue

    Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.

    Angel's friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.

    You have to calculate the minimal time to approach Angel. (We can move only UP, DOWN, LEFT and RIGHT, to the neighbor grid within bound, of course.)
     

    Input

    First line contains two integers stand for N and M.

    Then N lines follows, every line has M characters. "." stands for road, "a" stands for Angel, and "r" stands for each of Angel's friend.

    Process to the end of the file.
     

    Output

    For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing "Poor ANGEL has to stay in the prison all his life."
     

    Sample Input

    7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........
     

    Sample Output

    13
     
    bfs + 优先队列

    memset将每个字节置为00000001,而不是00000000。

    优先队列:b.ccount放在a.ccount前。
     
    #include <iostream>
    #include <cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    
    const int maxn = 205;
    char sta[maxn][maxn];
    int vis[maxn][maxn];
    int dir[4][2]= {1,0,-1,0,0,1,0,-1};
    int n,m,x2,y2;
    
    struct state
    {
        int x;
        int y;
        int ccount;
        friend bool operator<(state a,state b)
        {
            return b.ccount < a.ccount;
        }
    };
    
    int check(int x,int y)
    {
        if(x<0 || y<0 || x>=n || y>=m || !vis[x][y] || sta[x][y] == '#')
            return 1;
        else
            return 0;
    }
    
    int bfs(int x,int y)
    {
        int i;
        priority_queue<state>p;
        struct state next,t;
        t.x=x;
        t.y=y;
        t.ccount=0;
        p.push(t);
        vis[x][y]=0;
        while(!p.empty())
        {
            t=p.top();
            p.pop();
            if(t.x==x2&&t.y==y2)
            {
                return t.ccount;
            }
            for(i=0; i<4; i++)
            {
                next=t;
                next.x+=dir[i][0];
                next.y+=dir[i][1];
                if(check(next.x,next.y))
                       continue;
                next.ccount++;
                if(sta[next.x][next.y]=='x')
                    next.ccount++;
                if(vis[next.x][next.y]>=next.ccount)
                {
                    vis[next.x][next.y]=next.ccount;
                    p.push(next);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int i,j,x1,y1,ans;
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                {
                    scanf(" %c",&sta[i][j]);
                }
            }
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                {
                    if(sta[i][j]=='r')
                    {
                        x1=i;
                        y1=j;
                    }
                    else if(sta[i][j]=='a')
                    {
                        x2=i;
                        y2=j;
                    }
                }
            }
            memset(vis,1,sizeof(vis));
            ans=bfs(x1,y1);
            if(ans==-1)
                printf("Poor ANGEL has to stay in the prison all his life.
    ");
            else
                printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Java框架之SpringMVC
    Java进阶之路
    Java入门基础教学(含配置环境变量等)
    Vue 入门学习
    WCF综合运用之:文件断点续传
    爬取集思录数据(1)--强赎表
    爬虫知识点(一)
    已知1、某股票的增减持日期,2、股票从上市至今的交易数据,求减持后(交易日)1天,5天,15天的收盘价。
    从tushare获取增减持数据
    生成文本序列
  • 原文地址:https://www.cnblogs.com/coder-tcm/p/8933526.html
Copyright © 2011-2022 走看看