题目链接
思路:一开始疯狂在想火车的移动要怎么实现,看了大佬的代码才发现火车的移动可以看成自己向右移动两格(感觉自己想死也想不到啊QAQ)。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+1;
int T,n,k,vis[maxn][maxn];
char s[maxn][maxn];
bool check(int x,int y)
{
return s[x][y]>='A'&&s[x][y]<='Z';
}
bool bfs()
{
queue<pair<int,int>>q;
for(int i=1;i<=3;++i)
for(int j=1;j<=n;++j)
if(s[i][j]=='s') q.push({i,j}),vis[i][j]=1;
while(!q.empty())
{
pair<int,int>t=q.front();
q.pop();
int x=t.first,y=t.second;
if(y>=n) return true;
if(check(x,++y)) continue;
for(int j=-1;j<=1;++j)//向上、不动、向下
{
if(x+j<1||x+j>3) continue;
if(check(x+j,y+1)||check(x+j,y)||check(x+j,y+2)||vis[x+j][y+2]) continue;
if(y+2>=n) return true;
q.push({x+j,y+2});vis[x+j][y+2]=1;
}
}
return false;
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&k);
for(int i=1;i<=3;++i)
scanf("%s",s[i]+1);
printf("%s\n",bfs()?"YES":"NO");
}
}