AOJ 558 Cheese(bfs)

题意:网格图,老鼠吃奶酪,吃完奶酪体力值会增加,只能吃硬度不大于体力值的,问最小步数。

思路:按硬度从小到大的吃起,依次求最短路。

我用曼哈顿距离估价的A*,和普通bfs的time没区别啊,还把优先级那里写错了。。。

#include<bits/stdc++.h>
using namespace std;

#define PS push
#define PB push_back
#define MP make_pair
#define fi first
#define se second
const int INF = 0x3f3f3f3f;

typedef long long ll;

inline int read()
{
    int ret; char c; while(c = getchar(),c<'0'||c>'9');
    ret = c-'0';
    while(c = getchar(),c>='0'&&c<='9') ret = ret*10 + c-'0';
    return ret;
}

const int SZ = 1e3+5;

char g[SZ][SZ];
int H,W,N;
int vis[SZ][SZ],clk;
struct Node
{
    int x,y,f,h;
    bool operator <(const Node&th) const {
        return f > th.f || ( f == th.f && h < th.h);//
    }
}pos[10];

int tar;
inline int MHT(Node &o)
{
    return (abs(pos[tar].x-o.x) + abs(pos[tar].y-o.y));
}

void GetPos()
{
    REP0(i,H){
        REP0(j,W){
            char c = g[i][j];
            if(c == 'S'){
                pos[0] = {i,j};
            }else if('1'<= c && c <='9' ){
                pos[c-'0'] = {i,j};
            }
        }
    }
}

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

inline bool valid(int x,int y)
{
    return x>=0&&x<H&&y>=0&&y<W&&g[x][y]!='X'&&vis[x][y] != clk;
}

int astar_bfs(int st)
{
    priority_queue<Node> q;
    Node u;
    u.x = pos[st].x;
    u.y = pos[st].y;
    u.h = u.f = MHT(u);
    q.push(u);
    clk++;
    while(q.size()){
        u = q.top(); q.pop();
        if(u.x == pos[tar].x && u.y == pos[tar].y ) return u.f-u.h;
        REP0(k,4){
            Node v;
            v.x = u.x + dx[k];
            v.y = u.y + dy[k];
            if(!valid(v.x,v.y)) continue;
            vis[v.x][v.y] = clk;
            v.h = MHT(v);
            v.f = u.f-u.h+1+v.h;
            q.push(v);
        }
    }
    return -1;
}

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    H = read(); W = read(); N = read();
    for(int i = 0; i < H; i++){
        scanf("%s",g[i]);
    }
    GetPos();
    int ans = 0;
    REP1(i,N){
        tar = i;
        ans += astar_bfs(i-1);
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2015-10-18 15:33  陈瑞宇  阅读(243)  评论(0编辑  收藏  举报