又是个纯模拟,居然放在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;
}