CodeForces 586D【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;
}


原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777534.html