zoukankan      html  css  js  c++  java
  • [CF321A] Ciel and Robot

    [CF321A] Ciel and Robot

    Description

    你现在在一个迷宫的 ((0,0)) 处,给定一个包含 ( exttt{U,D,L,R}) 的操作序列 (s),其中 ( exttt{U}) 表示向上走一格,( exttt{D}) 表示向下走一格,( exttt{L}) 表示向左走一格,( exttt{R}) 表示向右走一格。你将会按照 (s) 从左往右的操作移动,并且重复若干次。问你是否能够到达 ((a,b)) 处。

    Solution

    将一轮中能到达的所有位置即为 (p_1,p_2,...,p_i),目标位置记为 (target),每做完一轮的偏移量为 (offset)。若存在 (i),使得 (offset | (target-p_i)),则输出 Yes。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    struct vec2
    {
        int x, y;
    
        vec2() : x(0), y(0)
        {
        }
    
        vec2(int x, int y) : x(x), y(y)
        {
        }
    
        bool div(const vec2 &rhs) const
        {
            if (x == 0 && rhs.x == 0 && y == 0 && rhs.y == 0)
                return true;
            if (x == 0 && rhs.x == 0 && y != 0 && rhs.y % y == 0 && rhs.y / y >= 0)
                return true;
            if (y == 0 && rhs.y == 0 && x != 0 && rhs.x % x == 0 && rhs.x / x >= 0)
                return true;
            if (x == 0 || y == 0)
                return false;
            if (rhs.x % x == 0 && rhs.y % y == 0)
            {
                int dx = rhs.x / x, dy = rhs.y / y;
                if (dx == dy && dx >= 0)
                    return true;
            }
            return false;
        }
    
        vec2 operator+(const vec2 &rhs) const
        {
            return {x + rhs.x, y + rhs.y};
        }
    
        vec2 operator-(const vec2 &rhs) const
        {
            return {x - rhs.x, y - rhs.y};
        }
    };
    
    signed main()
    {
        vec2 target;
        cin >> target.x >> target.y;
    
        string str;
        cin >> str;
    
        map<char, vec2> walk;
        walk['L'] = vec2(-1, 0);
        walk['R'] = vec2(+1, 0);
        walk['U'] = vec2(0, +1);
        walk['D'] = vec2(0, -1);
    
        vector<vec2> p;
        vec2 now;
    
        p.push_back(now);
        for (int i = 0; i < str.length(); i++)
        {
            now = now + walk[str[i]];
            p.push_back(now);
        }
    
        bool ans = 0;
        for (auto x : p)
        {
            auto y = target - x;
            if (now.div(y))
                ans = true;
        }
    
        if (ans)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    
  • 相关阅读:
    DB2常用命令2
    主流数据库命令的区别
    数据库开发
    DB2常用函数
    java Http post请求发送json字符串
    Spring Boot集成MyBatis与分页插件
    js实现加密(?!)
    本周、本月等日期的获取
    POST请求中参数以form data和request payload形式+清空数组方式
    转:目前为止最全的微信小程序项目实例
  • 原文地址:https://www.cnblogs.com/mollnn/p/14324344.html
Copyright © 2011-2022 走看看