题目大意:这道题的模型就是前一阵(或者说现在也还是)很流行的(地铁)跑酷游戏几乎是一样的,大意就是一个人在一个有三条轨道的隧道里跑,火车以一定的速度向他开过来,他在想办法走出隧道的过程中要不断躲避火车,问他是否能成功走出隧道。
解题思路:题目中人每次向前走一个单位然后可以选择原地不动或者变道;火车每次向前走两个单位,两者相向。每次处理如果要真的让火车的位置改变显然不现实。其实很容易看出来每次人相对火车走三个单位,这样只要处理人就行了。有一点要注意的是人是先向相对火车的方向走一步然后才能选择变道或者不动,这里需要特判一下。然后扩展一下地图右边界(隧道出口的边界),以免数组溢出就行了。
解题过程:这道题是个不太难的搜索,简单DFS就行。代码如下,搜索的思路参考了一下网址(博客)的思路:点击打开链接
<span style="font-family:Comic Sans MS;font-size:12px;">#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
char tun[3][110];
int vis[3][110];
int n,k;
bool flag; //判断是否能成功走出隧道的标志
bool inMap(int x)
{
if(x>=0 && x<=2)
return true;
return false;
}
void dfs(int x,int y)
{
vis[x][y]=1;
if(y>=n)
{
flag=true;
return ;
}
if(tun[x][y+1]!='.')
return ;
if(inMap(x-1) && !vis[x-1][y+3])
{
if(tun[x-1][y+1]=='.' && tun[x-1][y+2]=='.' && tun[x-1][y+3]=='.')
dfs(x-1,y+3);
}
if(inMap(x+1) && !vis[x+1][y+3])
{
if(tun[x+1][y+1]=='.' && tun[x+1][y+2]=='.' && tun[x+1][y+3]=='.')
dfs(x+1,y+3);
}
if(!vis[x][y+3])
{
if(tun[x][y+1]=='.' && tun[x][y+2]=='.' && tun[x][y+3]=='.')
dfs(x,y+3);
}
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> k;
memset(vis,0,sizeof(vis));
for(int i=0; i<3; i++)
cin >> tun[i];
for(int i=0; i<3; i++)
{
for(int j=n; j<n+5; j++)
tun[i][j]='.';
}
flag=false;
for(int i=0; i<3; i++)
{
for(int j=0; j<n; j++)
{
if(tun[i][j]=='s')
{
dfs(i,j);
break;
}
}
}
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}</span>