最后一个点WA调了半小时了
#include <bits/stdc++.h>
using namespace std;
const int N = 3e3 + 10;
struct node {
int nt, to, val;
} edge[N * 10];
int head[N], tot = 1;
void add(int u, int v, int w) {
edge[++tot] = {head[u], v, w};
head[u] = tot;
swap(u, v);
edge[++tot] = {head[u], v, 0};
head[u] = tot;
}
int tu[50][50];
char T[50][50];
int r, c, d;
int id[50][50], cnt;
int s, t, n;
int dis[N], now[N];
bool bfs() {
for (int i = 1; i <= n * 2 + 2; i++) {
dis[i] = 2e9;
}
queue<int> q;
q.push(s);
dis[s] = 0;
now[s] = head[s];
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = head[u]; i; i = edge[i].nt) {
int v = edge[i].to;
if (edge[i].val > 0 && dis[v] == 2e9) {
q.push(v);
dis[v] = dis[u] + 1;
now[v] = head[v];
if (v == t)
return 1;
}
}
}
return 0;
}
int dfs(int u, int sum) {
if (u == t)
return sum;
int k = 0, res = 0;
for (int i = now[u]; i; i = edge[i].nt) {
now[u] = i;
int v = edge[i].to;
if (edge[i].val > 0 && (dis[v] == dis[u] + 1)) {
k = dfs(v, min(sum, edge[i].val));
edge[i].val -= k;
edge[i ^ 1].val += k;
res += k;
sum -= k;
}
}
return res;
}
int main() {
int sum = 0;
cin >> r >> c >> d;
n = r * c;
s = n * 2 + 1, t = n * 2 + 2;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
char a;
cin >> a;
id[i][j] = ++cnt;
tu[i][j] = a - '0';
}
}
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
cin >> T[i][j];
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
add(id[i][j], id[i][j] + n, tu[i][j]);
if (T[i][j] == 'L') {
add(s, id[i][j], 1);
sum++;
}
for (int di = -d; di <= d; di++) {
for (int dj = -d; dj <= d; dj++) {
if (abs(di) + abs(dj) > d)
continue;
int x = i + di, y = j + dj;
if (x < 1 || x > r || y < 1 || y > c)
add(id[i][j] + n, t, 2e9);
else if (tu[x][y])
add(id[i][j] + n, id[x][y], 2e9);
}
}
}
}
int ans = 0;
while (bfs())
ans += dfs(s, 2e9);
cout << sum - ans;
return 0;
}