无语wa了很多次 后来复制了别个的输出 就ac了 文本对比了一下 坑死 was 打的 were 下次要注意···
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct edge
{
int u,v,flow,next;
}e[200000];int ecnt;
int head[1000];
char map[30][30];
char str[30][30];
int n,len;
int jumpnum;
int const inf = 1<<30;
int vis[20][20];
int abs(int a)
{
return a>0 ? a : -a;
}
void addedge(int u,int v,int flow)
{
e[ecnt].u = u;
e[ecnt].v = v;
e[ecnt].flow = flow;
e[ecnt].next = head[u];
head[u] = ecnt++;
e[ecnt].u = v;
e[ecnt].v = u;
e[ecnt].flow = 0;
e[ecnt].next = head[v];
head[v] = ecnt++;
}
int pre[1000],cur[1000],gap[1000],dis[1000];
int sap(int s,int t)
{
int flow = 0,aug = inf,u;
bool flag;
for(int i=0; i<=t; i++)
cur[i]=head[i],gap[i]=dis[i]=0;
gap[0] = t+1;
u = pre[s] = s;
while(dis[s]<t+1)
{
flag = false;
for(int &j=cur[u]; j!=-1; j=e[j].next)
{
int v = e[j].v;
if(e[j].flow>0&&dis[u]==dis[v]+1)
{
flag = true;
if(aug > e[j].flow) aug = e[j].flow;
pre[v] = u;
u = v;
if(u==t)
{
flow+=aug;
while(u!=s)
{
u = pre[u];
e[cur[u]].flow -= aug;
e[cur[u]^1].flow += aug;
}
aug = inf;
}
break;
}
}
if(flag) continue;
int mindis = t+1;
for(int j = head[u]; j!=-1; j=e[j].next)
{
int v = e[j].v;
if(e[j].flow > 0 && dis[v] < mindis )
mindis = dis[v],cur[u] = j;
}
if((--gap[dis[u]])==0) return flow;
gap[dis[u] = mindis + 1 ]++;
u = pre[u];
}
return flow;
}
int main()
{
int t,T=0;
scanf("%d",&t);
while(t--)
{
memset(head,-1,sizeof(head));
ecnt = 0;
int ans = 0;
scanf("%d%d",&n,&jumpnum);
for(int i =0;i<n;i++)
scanf("%s",map[i]);
len = strlen(map[0]);
for(int i = 0;i<n;i++){
scanf("%s",str[i]);
for(int j =0;j<len;j++){
if(map[i][j]-'0'>0)
{
if(i<jumpnum||n-i<=jumpnum||j<jumpnum||len-j<=jumpnum) addedge(i*len+j+1+n*len,2*n*len+1,inf);
addedge(i*len+j+1,i*len+j+1+n*len,map[i][j]-'0');
for(int p = i;p<n;p++)
for(int q = 0;q<len;q++){
if(p==i&&q==0) q = j+1;
if(map[p][q]-'0'>0&&abs(p-i)+abs(q-j)<=jumpnum)
addedge(i*len+j+1+n*len,p*len+q+1,inf),
addedge(p*len+q+1+n*len,i*len+j+1,inf);
}
}
if(str[i][j]=='L')ans++,addedge(0,i*len+j+1,1);
}
}
ans -= sap(0,2*n*len+1);
if(ans>1)
printf("Case #%d: %d lizards were left behind.\n",++T,ans);
else if(ans)
printf("Case #%d: %d lizard was left behind.\n",++T,ans);
else
printf("Case #%d: no lizard was left behind.\n",++T);
}
}