题意:
s是这个人开始位置;连续相同大写字母是 Each of the k trains,相应的火车具有相应的字母;
'.' 代表空;
有个人在最左列,上面有连续字母代表的火车,火车从左边出去的话,会从右边继续进来,
一开始是人先往右走一步,然后上下或者一步,然后火车往左移两步。
BFS;
s是这个人开始位置;连续相同大写字母是 Each of the k trains,相应的火车具有相应的字母;
'.' 代表空;
有个人在最左列,上面有连续字母代表的火车,火车从左边出去的话,会从右边继续进来,
一开始是人先往右走一步,然后上下或者一步,然后火车往左移两步。
n有100,代表长度,k代表火车的数量;
思路:BFS;
走完还要再走两个= =、妈个鸡啊。
一开始一直踏马地觉得没必要BFS,没必要BFS...后面搞懂了之前比赛中的思路是递推,也就是DP,但是踏马的DP递推真的写成了递推,往下乱搞。。。
感觉如果BFS简单清晰就直接上手啊!= =况且明明搜索擅长还不写,真是不好好想想就直接pass方案,真是蠢到家了!
贴一发挫代码//
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
char ma[5][110];
bool vis[5][110];
struct asd{
int x,y;
};
queue<asd>q;
int n,k;
bool Judge(int x,int y)
{
if(x<0||x>=3||vis[x][y]||ma[x][y]!='.')
return 0;
return 1;
}
void solve_down(asd next)
{
next.x++;
if(Judge(next.x,next.y))
{
next.y++;
if(Judge(next.x,next.y))
{
next.y++;
if(Judge(next.x,next.y))
{
vis[next.x][next.y]=1;
q.push(next);
}
}
}
}
void solve_up(asd next)
{
next.x--;
if(Judge(next.x,next.y))
{
next.y++;
if(Judge(next.x,next.y))
{
next.y++;
if(Judge(next.x,next.y))
{
vis[next.x][next.y]=1;
q.push(next);
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&k);
for(int i=0;i<3;i++)
scanf("%s",ma[i]);
ma[0][n]=ma[0][n+1]='.';
ma[1][n]=ma[1][n+1]='.';
ma[2][n]=ma[2][n+1]='.';
asd now,next;
for(int i=0;i<3;i++)
if(ma[i][0]=='s')
{
now.x=i;
now.y=0;
break;
}
q.push(now);
bool flag=0;
while(!q.empty())
{
now=q.front();
q.pop();
if(now.y>=n-1)
{
flag=1;
break;
}
next.x=now.x;
next.y=now.y+1;
if(!Judge(next.x,next.y))
continue;
solve_down(next);
solve_up(next);
next.y++;
if(Judge(next.x,next.y))
{
next.y++;
if(Judge(next.x,next.y))
{
vis[next.x][next.y]=1;
q.push(next);
}
}
}
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}