样例就输出 0
#include<bits/stdc++.h>
#define pb push_back
#define pin(i,j) ((i-1)*m+j+1)
#define pout(i,j) (pin(i,j)+n*m)
#define INF (int)1e9
using namespace std;
const int N=805;
const int M=2e5+5;
int n,m,s,t,d,tot=1,cnt,head[N],vis[N],pre[N];
struct Edge{int to,nxt,cap,flow;}edge[M<<1];
void add(int u,int v,int cap){
edge[++tot]={v,head[u],cap,0};
head[u]=tot;
edge[++tot]={u,head[v],0,0};
head[v]=tot;
}
bool bfs(){
memset(vis,0,sizeof vis),vis[s]=1;
queue<int> q;q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(!vis[v]&&edge[i].cap>edge[i].flow){
vis[v]=1,pre[v]=i,q.push(v);
if(v==t) return true;
}
}
}
return false;
}
int EK(){
int res=0;
while(bfs()){
int p=INT_MAX,v=t;
while(v!=s){
int i=pre[v];
p=min(p,edge[i].cap-edge[i].flow);
v=edge[i^1].to;
}
res+=p,v=t;
while(v!=s){
int i=pre[v];
edge[i].flow+=p;
edge[i^1].flow-=p;
v=edge[i^1].to;
}
}
return res;
}
int main(){
scanf("%d%d%d",&n,&m,&d);
s=1,t=n*m*2+2;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int x;
scanf("%1d",&x);
if(x) add(pin(i,j),pout(i,j),x);
if(i-d<1||i+d>n||j-d<1||j+d>n) add(pout(i,j),t,INF);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
scanf(" %c",&c);
if(c=='L'){
cnt++;
add(s,pin(i,j),1);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
for(int l=1;l<=m;l++){
if(i==k&&j==l) continue;
if((i-k)*(i-k)+(j-l)*(j-l)<=d*d) add(pout(i,j),pin(k,l),INF);
}
}
}
}
printf("%d",cnt-EK());
return 0;
}