AOJ 558 Cheese

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

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

我用曼哈顿距离估价的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;
}
时间: 2024-11-04 17:02:05

AOJ 558 Cheese的相关文章

AOJ 0558 Cheese

Cheese Time Limit : 8 sec, Memory Limit : 65536 KB チーズ (Cheese) 問題 今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から顔を出した.JOI 町は東西南北に区画整理されていて,各区画は巣,チーズ工場,障害物,空き地のいずれかである.ねずみは巣から出発して全てのチーズ工場を訪れチーズを 1 個ずつ食べる. この町には,N 個のチーズ工場があり,どの工場も1種類のチーズだけを生産している.チーズの硬さは工場によって異なって

AOJ 0558 Cheese【BFS】

在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪.有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪.老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪. 老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走.走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计.问吃遍所有奶酪最少用时. 输入:第一行三个整数H(1 <= H <= 1000).W(1 <= W <=1000

[2016-03-28][HDU][1078][FatMouse and Cheese]

时间:2016-03-28 17:40:34 星期一 题目编号:[2016-03-28][HDU][1078][FatMouse and Cheese] #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int maxn = 100 + 10; int a[maxn][maxn]; int dp[maxn][maxn]; int n ,k; int d

记忆化搜索,FatMouse and Cheese

1.从gird[0][0]出发,每次的方向搜索一下,每次步数搜索一下 for(i=0; i<4; i++) { for(j=1; j<=k; j++) { int tx=x+d[i][0]*j; int ty=y+d[i][1]*j; if(tx>=0&&tx<n&&ty>=0&&ty<n&&grid[x][y]<grid[tx][ty]) { int temp=memSearch(tx,ty); i

HDU1078 FatMouse and Cheese 【内存搜索】

FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4966    Accepted Submission(s): 2035 Problem Description FatMouse has stored some cheese in a city. The city can be considere

UVA1001 Say Cheese

如果没有洞,那么任意两点的最短距离就是直线距离,洞里是瞬间的,所以看成一个点就行了(其实点也可以当作半径为0的洞来处理),洞到洞的最短距离都是圆心距离减去半径.剩下的就是完全图求单源最短路径,用不加堆优化的dijkstra就行了O(n^2). #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 102; int x[maxn],y[maxn],z[maxn],r[maxn]; d

hdu 1078 FatMouse and Cheese

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5701    Accepted Submission(s): 2320 Problem Description FatMouse has stored some cheese in a city. The city can be considered as a square grid of

BZOJ2021: [Usaco2010 Jan]Cheese Towers

2021: [Usaco2010 Jan]Cheese Towers Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 184  Solved: 107[Submit][Status] Description Farmer John wants to save some blocks of his cows' delicious Wisconsin cheese varieties in his cellar for the coming winter.

AOJ 169 找零钱 DP OR 母函数

一直觉得这题因为有总量限制,是不能用母函数解的,今天偶然发现原来是可以的,记录一下. 只要搞母函数的时候多开一维来表示用了多少个硬币就好了,其实就是目标状态是二维的母函数 类似于 假设我现在要处理的面值是2      (1 + x^2 * y + x^4 * y ^ 2 + x ^ 6 * y ^ 3...) 就表示用0个,1个,2个,3个..硬币的状态了. 看来母函数最重要的还是对式子本身的理解,这样才能应对各种变化. #include <cstdio> #include <cstri