链接:http://codeforces.com/contest/1072/problem/D
思路: 其实第i步走到哪些点事确定的,所以我们可以开两个队列 分别表示 第i 步和第i+1 步走的点。 然后滚动一下子就可以,对于每个点最优情况就是如果这个点是‘a’ 那么k不用减少,如果不是‘a’ 并且k>0 那么k-1 变成a 否则 不变。 然后每次滚动都有最多n个进队列,所以复杂度就是n方。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf =0x3f3f3f3f;
const int N = 2005;
char mp[N][N];
int n,k;
int tim[N][N];
int vis[N][N];
int book[N][N];
int ne[2][2]={1,0,0,1};
struct node
{
int x,y;
int k;
char c;
}que1[N],que2[N];
int isok(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=n) return 1;
return 0;
}
void bfs()
{
vector< int >ans;
int flag=0;
int tot1,tot2;
tot1=tot2=0;
if(k>0)
{
if(mp[1][1]!='a')
{
que1[++tot1]=(node){1,1,k-1,'a'};
}
else que1[++tot1]=(node){1,1,k,'a'};
}
else
{
que1[++tot1]=(node){1,1,0,mp[1][1]};
}
int x,y,tx,ty,kk,tk;
while(1)
{
if(flag==0)
{
if(tot1==0) break;
int mn=0x3f3f3f;
for(int i=1;i<=tot1;i++)
{
mn=min(mn,(int)que1[i].c);
}
tot2=0;
for(int i=1;i<=tot1;i++)
{
int jud=(int)que1[i].c;
if(jud>mn) continue;
x=que1[i].x; y=que1[i].y; kk=que1[i].k;
for(int j=0;j<2;j++)
{
tx=x+ne[j][0];
ty=y+ne[j][1];
if(isok(tx,ty))
{
if(kk>0)
{
if(mp[tx][ty]=='a')
{
tim[tx][ty]=max(tim[tx][ty],kk);
}
else
{
tim[tx][ty]=max(tim[tx][ty],kk-1);
vis[tx][ty]=1;
}
}
else
{
tim[tx][ty]=max(tim[tx][ty],0);
}
}
}
}
char cc;
for(int i=1;i<=tot1;i++)
{
int jud=(int)que1[i].c;
if(jud>mn) continue;
x=que1[i].x; y=que1[i].y; kk=que1[i].k;
for(int j=0;j<2;j++)
{
tx=x+ne[j][0];
ty=y+ne[j][1];
if(book[tx][ty]) continue;
if(isok(tx,ty))
{
if(vis[tx][ty]) cc='a';
else cc=mp[tx][ty];
que2[++tot2]=(node){tx,ty,tim[tx][ty],cc};
book[tx][ty]=1;
}
}
}
ans.push_back(mn);
flag=1;
}
else
{
if(tot2==0) break;
tot1=0;
int mn=0x3f3f3f;
for(int i=1;i<=tot2;i++)
{
mn=min(mn,(int)que2[i].c);
}
for(int i=1;i<=tot2;i++)
{
int jud=(int )que2[i].c;
if(jud>mn) continue;
x=que2[i].x; y=que2[i].y; kk=que2[i].k;
for(int j=0;j<2;j++)
{
tx=x+ne[j][0];
ty=y+ne[j][1];
if(isok(tx,ty))
{
if(kk>0)
{
if(mp[tx][ty]=='a')
{
tim[tx][ty]=max(tim[tx][ty],kk);
}
else
{
tim[tx][ty]=max(tim[tx][ty],kk-1);
vis[tx][ty]=1;
}
}
else
{
tim[tx][ty]=max(tim[tx][ty],0);
}
}
}
}
char cc;
for(int i=1;i<=tot2;i++)
{
int jud=(int )que2[i].c;
if(jud>mn) continue;
x=que2[i].x; y=que2[i].y; kk=que2[i].k;
for(int j=0;j<2;j++)
{
tx=x+ne[j][0];
ty=y+ne[j][1];
if(book[tx][ty]) continue;
if(isok(tx,ty))
{
if(vis[tx][ty]) cc='a';
else cc=mp[tx][ty];
que1[++tot1]=(node){tx,ty,tim[tx][ty],cc};
book[tx][ty]=1;
}
}
}
ans.push_back(mn);
flag=0;
}
}
for(int i=0;i<ans.size();i++)
{
printf("%c",ans[i]);
}
printf("\n");
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
scanf("%s",mp[i]+1);
}
bfs();
return 0;
}