ABC443-E题解
wrz_pussycat296 · · 题解
思路
一看这种题,直接动态规划。
我们定义
然后转移就很好办了。
如果当前不为墙且
如果当前为墙且
再考虑转移
最后输出就可以了。是不是很简单啊。
代码
#include<bits/stdc++.h>
using namespace std;
int T,N,C;
char S[3005][3005];
bool v[3005][3005],u[3005][3005];
int h,t;
int p[3005];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&C);
for(int i=1;i<=N;i++){
scanf("%s",S[i]+1);
for(int j=1;j<=N;j++)
u[i][j]=0,v[i][j]=0;
}
u[N][C]=v[N][C]=1;
for(int j=1;j<=N;j++)
if(S[N][j]=='.')u[N][j]=1;
for(int i=N-1;i>=1;i--){
for(int j=1;j<=N;j++){
if(S[i][j]=='.'){
if(v[i+1][j]==1||v[i+1][j+1]==1||v[i+1][j-1]==1){
v[i][j]=1;
}
if(u[i+1][j]==1)u[i][j]=1;
}
else{
if(u[i+1][j]==1){
if(v[i+1][j]==1||v[i+1][j+1]==1||v[i+1][j-1]==1){
v[i][j]=1;
if(u[i+1][j]==1)u[i][j]=1;
}
}
}
//cout<<i<<' '<<j<<' '<<v[i][j]<<' '<<u[i][j]<<endl;
}
}
for(int j=1;j<=N;j++)
cout<<v[1][j];
cout<<endl;
}
return 0;
}
AC 记录