题意:在n×m的迷宫里,有空地和障碍,有一个超能力:当前位置朝任意方向上所有的障碍物都会清除,超能力最多使用一次,如果可以到终点输出yes
分析:先从终点开始走,将沿路的障碍的横坐标和纵坐标都做上标记,再从起点开始走,如果下一个网格为障碍,判断该方向的坐标是否被做上标记,如果被标记,则可以在该方向上释放超能力。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+10;
int n,m,sx,sy,zx,zy;
char a[N][N];
ll ans=0;
int temp[N][N],xx[N],yy[N];
ll dx[4]={0,0,1,-1};
ll dy[4]={-1,1,0,0};
void d(int x,int y){
if(x==sx&&y==sy){
ans++;
return;
}
for(int i=0;i<4;i++){
if(a[x+dx[i]][y+dy[i]]=='#'){
xx[x+dx[i]]=1;
yy[y+dy[i]]=1;
}
if(temp[x+dx[i]][y+dy[i]]==0&&(a[x+dx[i]][y+dy[i]]=='E'||a[x+dx[i]][y+dy[i]]=='.'||a[x+dx[i]][y+dy[i]]=='S')){
temp[x][y]=1;
d(x+dx[i],y+dy[i]);
}
}
}
void dd(int x,int y){
if(x==zx&&y==zy){
ans++;
return;
}
for(int i=0;i<4;i++){
if(temp[x+dx[i]][y+dy[i]]==0&&(a[x+dx[i]][y+dy[i]]=='E'||a[x+dx[i]][y+dy[i]]=='.'||a[x+dx[i]][y+dy[i]]=='S')){
temp[x][y]=1;
dd(x+dx[i],y+dy[i]);
}
else if(temp[x+dx[i]][y+dy[i]]==0&&a[x+dx[i]][y+dy[i]]=='#'){
if(yy[y]==1&&dy[i]==0){
ans++;
return;
}
else if(xx[x]==1&&dx[i]==0){
ans++;
return;
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
sx=i,sy=j;
}
else if(a[i][j]=='E'){
zx=i,zy=j;
}
}
}
d(zx,zy);
if(ans>0){
cout<<"YES"<<endl;
return 0;
}
dd(sx,sy);
if(ans>0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}