#include<bits/stdc++.h> #define reg register int #define il inline #define fi first #define se second #define mk(a,b) make_pair(a,b) #define numb (ch^'0') using namespace std; typedef long long ll; template<class T>il void rd(T &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x); } template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');} template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');} template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{ const int N=20*2+20; const int inf=0x3f3f3f3f; int n,m,D; char mp[N][N],a[N][N]; int dis(int x1,int y1,int x2,int y2){ return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); } int s,t; struct node{ int nxt,to; int w; }e[2*(N*N)]; int hd[N],cnt=1; void add(int x,int y,int c){ e[++cnt].nxt=hd[x]; e[cnt].to=y;e[cnt].w=c; hd[x]=cnt; e[++cnt].nxt=hd[y]; e[cnt].to=x;e[cnt].w=0; hd[y]=cnt; } int d[N]; int dfs(int x,int flow){ if(x==t) return flow; int res=flow; for(reg i=hd[x];i&&res;i=e[i].nxt){ int y=e[i].to; if(d[y]==d[x]+1&&e[i].w){ int k=dfs(y,min(res,e[i].w)); if(!k) d[y]=0; e[i].w-=k; res-=k; e[i^1].w+=k; } } return flow-res; } int q[N],l,r; bool bfs(){ memset(d,0,sizeof d); d[s]=1; q[++r]=s; while(l<=r){ int x=q[l++]; for(reg i=hd[x];i;i=e[i].nxt){ int y=e[i].to; if(e[i].w&&!d[y]){ d[y]=d[x]+1; q[++r]=y; if(y==t) return true; } } } return false; } int num(int x,int y,int c){ return (x-1)*m+y+c*n*m; } int main(){ rd(n);rd(m);rd(D); for(reg i=1;i<=n;++i){ scanf("%s",mp[i]+1); for(reg j=1;j<=m;++j){ add(num(i,j,0),num(i,j,1),mp[i][j]-'0'); } } s=0;t=num(n,m,1)+1; int tot=0; for(reg i=1;i<=n;++i){ scanf("%s",a[i]+1); for(reg j=1;j<=m;++j){ if(a[i][j]=='L'){ add(s,num(i,j,0),1); ++tot; } } } for(reg i=1;i<=n;++i){ for(reg j=1;j<=m;++j){ for(reg k=1;k<=n;++k){ for(reg p=1;p<=m;++p){ if(!((k==i)&&(p==j))){ if(dis(i,j,k,p)<=D*D){ cout<<" go "<<i<<" "<<j<<" to "<<k<<" "<<p<<endl; add(num(i,j,1),num(k,p,0),inf); } } } } if(i<=D||i>=n-D+1||j<=D||j>=m-D+1){ add(num(i,j,1),t,inf); } } } int ans=0,flow; while(bfs()){ while(flow=dfs(s,inf)) ans+=flow; } cout<<tot-ans; return 0; } } signed main(){ Miracle::main(); return 0; } /* Author: *Miracle* Date: 2019/4/13 19:58:12 */
lizard
猜你喜欢
转载自www.cnblogs.com/Miracevin/p/10703128.html
今日推荐
周排行