原文链接:http://codeforces.com/problemset/problem/586/D
思路:
是一道常规的DFS,所采用的方法是相对运动法
采取的处理方式是假设火车不动,人在横向移动的时候是移动3个格的,竖向移动为下移、上移、不动三种选择。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int n,k;
char mapp[3][110];
bool vis[3][110];
bool flag;
void DFS(int x,int y)
{
vis[x][y]=1;
if(flag)
return;
if(y>=n)
{
flag=true;
return;
}
if(mapp[x][y+1]!='.')
return;
//采取的处理方式是假设火车不动,人在横向移动的时候是移动3个格的,竖向移动为下移、上移、不动三种选择。
if(x<2&&!vis[x+1][y+3])
{
if(mapp[x+1][y+1]=='.'&&mapp[x+1][y+2]=='.'&&mapp[x+1][y+3]=='.')
DFS(x+1,y+3);
}
if(x>0&&!vis[x-1][y+3])
{
if(mapp[x-1][y+1]=='.'&&mapp[x-1][y+2]=='.'&&mapp[x-1][y+3]=='.')
DFS(x-1,y+3);
}
if(!vis[x][y+3])
{
if(mapp[x][y+1]=='.'&&mapp[x][y+2]=='.'&&mapp[x][y+3]=='.')
DFS(x,y+3);
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&k);
memset(vis,0,sizeof(vis));
for(int i=0;i<3;i++)
{
scanf("%s",mapp[i]);
}
for(int i = 0;i < 3;i++)
for(int j = n;j < n+5;j++)//这里是地图扩展处理,因为我们是假设火车不动,让人走(相对)3个格,会出边境,所以为防止出现这类情况,就扩展地图。
mapp[i][j] = '.';
flag=false;
for(int i=0;i<3;i++)
for(int j=0;j<n;j++)
{
if(mapp[i][j]=='s')
{
DFS(i,j);
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}