uva 10798 - Be wary of Roses(最短路)

题目链接:uva 10798 - Be wary of Roses

代码

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>

using namespace std;
const int maxn = 23;
const int maxm = 11;
const int dir[][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};

struct State {
    int x, y, l, u, r, d, w;
    State (int x = 0, int y = 0, int l = 0, int u = 0, int r = 0, int d = 0): x(x), y(y), l(l), u(u), r(r), d(d) {
        w = max(max(l, r), max(u, d));
    }
    bool operator <  (const State& u) const { return w > u.w; }
};

int N, vis[maxn][maxn][maxm][maxm][maxm][maxm];
char G[maxn][maxn];

int bfs (int x, int y) {
    memset(vis, 0, sizeof(vis));
    priority_queue<State> que;

    vis[x][y][0][0][0][0] = 1;
    que.push(State(x, y, 0, 0, 0, 0));

    while (!que.empty()) {
        State u = que.top();
        que.pop();

        for (int i = 0; i < 4; i++) {
            State v = u;
            int x = u.x + dir[i][0];
            int y = u.y + dir[i][1];
            if (x <= 0 || x > N || y <= 0 || y > N) return u.w;
            v.x = x;
            v.y = y;

            if (G[x][y] == 'R') v.l++;
            if (G[y][N-x+1] == 'R') v.u++;
            if (G[N-x+1][N-y+1] == 'R') v.r++;
            if (G[N-y+1][x] == 'R') v.d++;
            if (vis[x][y][v.l][v.u][v.r][v.d]) continue;
            vis[x][y][v.l][v.u][v.r][v.d] = 1;
            que.push(State(v.x, v.y, v.l, v.u, v.r, v.d));
        }
    }
    return -1;
}

int main () {
    while (scanf("%d", &N) == 1 && N) {
        for (int i = 1; i <= N; i++)
            scanf("%s", G[i]+1);
        printf("At most %d rose(s) trampled.\n", bfs(N/2+1, N/2+1));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值