zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        return 0;
    }
  • 相关阅读:
    MySQL核心知识学习之路()
    软件设计之路(5)
    软件设计之路(4)
    软件设计之路(4)
    软件设计之路(3)
    软件设计之路(2)
    软件设计之美-软件设计之路
    js将 “2021-07-06T06:23:57.000+00:00” 转换为年月日时分秒
    git pull/push 拉取/推送指定分支的代码
    git clone 指定分支的代码
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4889607.html
Copyright © 2011-2022 走看看