题目链接
题目大意
现在有一个3*n的矩阵,有一个人在矩阵的最左边,要去到最右边,矩阵中字母串代表火车,‘ . ’ 代表可以走,每一秒钟,这个人可以向前走一步,并且可以向上向下或者原地不动,火车每秒钟向右走两步。问你这个人可不可以到达矩阵的最右边。
解题思路
火车向右走我们可以当成这个人向左走了两步,也就是这个可以每秒钟向前走一步再向上向下或者原地不动,再向前走两步,在不碰到火车的前提下,能不能到达最右边,也就是个广搜。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int x,y;
node(){}
node(int X,int Y)
{
x=X;
y=Y;
}
};
char s[5][105];
int vis[5][105];
int nex[3][2]={{1,0},{0,0},{-1,0}};
int n,k;
int dfs()
{
queue<node>que;
if(s[1][1]=='s')
{
vis[1][1]=1;
que.push(node(1,1));
}
else if(s[2][1]=='s')
{
vis[2][1]=1;
que.push(node(2,1));
}
else
{
vis[3][1]=1;
que.push(node(3,1));
}
node a;
while(!que.empty())
{
a=que.front();
que.pop();
int xx=a.x,yy=a.y;
if(yy>=n)
return 1;
yy++; //向前一格
if(s[xx][yy]>='A')
continue;
for(int i=0;i<3;i++)
{
int tx=xx+nex[i][0];
int ty=yy+nex[i][1];
//printf("%d %d\n",tx,ty);
if(s[tx][ty]>='A'||tx<1||tx>3||vis[tx][ty]==1||ty>n+3)
continue;
if(s[tx][ty+1]>='A'||s[tx][ty+2]>='A')
continue;
// printf("%d %d\n",tx,ty);
que.push(node(tx,ty+2));
vis[tx][ty]=1;
}
}
return 0;
}
int main()
{
int T;
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);
int flag=dfs();
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}