• 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;
    }
    


  • 相关阅读:
    TP之Model(select(),add())
    TP之空操作及View模块
    ThinkPHP之初识
    smarty引擎之练习
    领先环境HTML
    php流程
    分页
    弹窗
    邮箱项目
    TP框架修改操作
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777534.html
Copyright © 2020-2023  润新知