zoukankan      html  css  js  c++  java
  • CodeForces 586D

    题意略。

    将人的移动分为3步,第一步向右,第二步是行之间的变换,第三步是向右走2步,三步加在一起算作是一次移动,计入判重数组。

    在第一步时有一个特殊情况:已经越过最右边的边界线,这时graph[x][y] != '.',要进行特判。

    在第二步时要注意越界和撞上火车。

    在第三步时有3种情况:

    1.只需走1步就可以到达边界线。此时,我需要特判。

    2.走2步才能到达边界线。注意graph[x][y + 1]不能是火车。

    3.不能到达边界线。注意graph[x][y + 1]和graph[x][y + 2]不能是火车。

    至于为什么wa这么多次,应该是我没有考虑走路的连贯性,在棋盘上走的时候都是跳跃的。

    详见代码:

    #include<bits/stdc++.h>
    #define maxn1 30
    #define maxn2 150
    using namespace std;
    
    char graph[5][maxn2];
    int visit[5][maxn2];
    int n,k,T;
    
    struct point{
        int x,y;
        point(int a = 0,int b = 0){
            x = a,y = b;
        }
        point operator+ (point p){
            return point(p.x + x,p.y + y);
        }
    };
    
    bool bfs(point s){
        queue<point> que;
        visit[s.x][s.y] = 1;
        que.push(s);
        while(que.size()){
            point temp = que.front();
            que.pop();
            point nxt1 = temp + point(0,1);
            if(nxt1.y >= n - 1) return true;
            if(graph[nxt1.x][nxt1.y] != '.') continue;
            point nxt2;
            for(int i = -1;i <= 1;++i){
                nxt2 = nxt1 + point(i,0);
                if(nxt2.x < 0 || nxt2.x > 2 || graph[nxt2.x][nxt2.y] != '.') continue;
                point nxt3 = nxt2 + point(0,2);
                if(nxt3.y < n - 1 && graph[nxt2.x][nxt2.y + 1] == '.' && graph[nxt2.x][nxt2.y + 2] == '.' && visit[nxt3.x][nxt3.y] == 0){
                    visit[nxt3.x][nxt3.y] = 1;
                    que.push(nxt3);
                }
                else if(nxt2.y + 1 >= n - 1 && visit[nxt3.x][nxt3.y] == 0){
                    visit[nxt3.x][nxt3.y] = 1;
                    que.push(nxt3);
                }
                else if(nxt3.y >= n - 1 && graph[nxt2.x][nxt2.y + 1] == '.' && visit[nxt3.x][nxt3.y] == 0){
                    visit[nxt3.x][nxt3.y] = 1;
                    que.push(nxt3);
                }
            }
        }
        return false;
    }
    
    int main(){
        scanf("%d",&T);
        while(T--){
            memset(visit,0,sizeof(visit));
            scanf("%d%d",&n,&k);
            point start;
            for(int i = 0;i < 3;++i){
                scanf("%s",graph[i]);
                if(graph[i][0] == 's'){
                    start = point(i,0);
                    graph[i][0] = '.';
                }
            }
            printf("%s
    ",bfs(start) ? "YES" : "NO");
        }
        return 0;
    }

     

  • 相关阅读:
    js 日期插件 datepicker
    Yii 安装二维码扩展Qrcode
    Yii2 验证码
    Yii 通过composer 安装的方法
    JQery icheck 插件
    Yii 设置 flash消息 创建一个渐隐形式的消息框
    Yii2 自动更新时间created_at updated_at
    MySQL 安装与使用(二)
    MySQL 安装与使用(一)
    Nginx使用(配置开机启动)
  • 原文地址:https://www.cnblogs.com/tiberius/p/8477015.html
Copyright © 2011-2022 走看看