hdu 1242 bfs

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#define MAX 207

using namespace std;

int n,m,sx,sy;
int mp[MAX][MAX];
int mark[MAX][MAX];
char s[MAX];
int ans;

struct Node
{
    int x,y,t;
}tmp,st;

int dx[] = { 0 , 1 , -1 ,  0 , 0 };
int dy[] = { 0 , 0 ,  0 , -1 , 1 }; 

void bfs ( )
{
    queue<Node> q;
    st.x = sx , st.y = sy , st.t = 0;
    q.push ( st );
    mark[sx][sy] = 1;
    while ( !q.empty())
    {
        tmp = q.front();
       // cout << tmp.x << " " << tmp.y << endl;
        q.pop ( );
        if ( mp[tmp.x][tmp.y] == 3 )
        {
            if ( ans == -1 ) ans = tmp.t-2;
            else  ans = min ( ans , tmp.t-2 );
        }
        for ( int i = 1 ; i <= 4 ; i++ )
        {
            st.x = tmp.x + dx[i] , st.y = tmp.y + dy[i];
            if ( !mp[st.x][st.y] ) continue;
            st.t = tmp.t + mp[st.x][st.y];
            if ( mark[st.x][st.y] <= st.t ) continue;
            mark[st.x][st.y] = st.t;
            q.push ( st );
        }
    }
}

int main ( )
{
    while ( ~scanf ( "%d%d" , &n , &m ) )
    {
        ans = -1;
        memset ( mp , 0 , sizeof ( mp ) );
        memset ( mark , 0x3f , sizeof ( mark ) );
        for ( int i = 1 ; i <= n ; i++ )
        {
            scanf ( "%s" , s+1 );
            for ( int j = 1 ; j <= m ; j++ )
                if ( s[j] == '.' ) mp[i][j] = 1;
                else if ( s[j] == 'x' ) mp[i][j] = 2;
                else if ( s[j] == 'a' ) mp[i][j] = 3;
                else if ( s[j] == 'r' ) mp[i][j] = 1, sx = i , sy = j;    
        }
        bfs ( );
        if ( ans == -1 ) 
            puts ( "Poor ANGEL has to stay in the prison all his life." );
        else printf ( "%d\n" , ans );
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值