CF1105D Kilani and the Game

题目地址:洛谷CF1105D

又是个纯模拟,居然放在D,呵呵

因为最多9人,所以直接建9个队列BFS

再就是注意特判各种可能的情况

比赛时又是过了Pretest,结果fst了

出题人真心zz

代码:

#include <bits/stdc++.h>
#define pii pair<int, int>
#define x first
#define y second
using namespace std;
const int N = 1006, P = 10;
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
int n, m, p, a[P], c[P], d[N][N], cnt, k;
char s[N][N];
queue<pii> q[P];

int main() {
    cin >> n >> m >> p;
    for (int i = 1; i <= p; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++) {
        scanf("%s", s[i] + 1);
        for (int j = 1; j <= m; j++) {
            int w = s[i][j] - '0';
            if (w > 0 && w <= p) {
                q[w].push(make_pair(i, j));
                ++c[w];
            } else if (s[i][j] == '.') ++cnt;
        }
    }
    while (cnt) {
        ++k;
        int t = p;
        for (int i = 1; i <= p; i++) {
            int w = k * a[i];
            while (q[i].size()) {
                pii x = q[i].front();
                if (d[x.x][x.y] == w) break;
                q[i].pop();
                for (int j = 0; j < 4; j++) {
                    pii y = make_pair(x.x + dx[j], x.y + dy[j]);
                    if (s[y.x][y.y] != '.') continue;
                    s[y.x][y.y] = s[x.x][x.y];
                    d[y.x][y.y] = d[x.x][x.y] + 1;
                    q[i].push(y);
                    --cnt;
                    ++c[i];
                }
            }
            if (q[i].empty()) --t;
        }
        if (!t) break;
    }
    for (int i = 1; i <= p; i++) printf("%d ", c[i]);
    puts("");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xht37/p/10298598.html