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;
    }
  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4889607.html
Copyright © 2011-2022 走看看