课后自主练习(implement)1089. 移动游戏 medium《编程思维与实践》个人学习笔记

题目

在这里插入图片描述
在这里插入图片描述

思路

把经过的每一个点进行记录,把一个循环的终点,起点的dx和dy进行记录
然后将输入的点按x,y逐次对比每个被记录的点

我们从一维的方向进行分析
若dx > 0,x > px, x-px是dx的倍数,说明在以后的循环种是可以达到x值的
若dx < 0,x < px, x - px是dx的倍数,同上
若dx = 0,说明最后这个x都会回归到原点,这时候只要有一次x == px,就说明每一次循环都会回到该处

于是倘若12情况下的x和y在同一轮循环里面到达,我们就认为是Yes!
倘若在3的情况下,满足123的任意一种情况,我们也认为是Yes
其他情况下统统不能到达

代码

#include<iostream>

using namespace std;

struct point
{
    int x;
    int y;
};

int func(int x, int px, int dx)
{
    if(dx == 0 && x == px)
        return -2;//每一次循环都能到达
    else if(dx > 0 && x >= px && (x - px) % dx == 0 )
        return (x - px) / dx; 
    else if(dx < 0 && x <= px && (x - px) % dx == 0 )
        return (x - px) / dx;
    else 
        return -1; 
}

int main()
{
    point p[200];
    p[0].x = p[0].y = 0;
    string s;
    cin >> s;
    int len = s.length();

    for(int i = 0; i < len; i++)
    {
        p[i + 1].x = p[i].x;
        p[i + 1].y = p[i].y;
        switch (s[i])
        {
        case 'U':
            p[i+1].y += 1;
            break;
        case 'D':
            p[i+1].y -= 1;
            break;
        case 'L':
            p[i+1].x -= 1;
            break;
        case 'R':
            p[i+1].x += 1;
            break;
        }
    }    

    int dx = p[len].x, dy = p[len].y;

    int t;
    cin >> t;
    for(int i = 0; i < t; i++)
    {
        int x,y;
        cin >> x >> y;
        int r_x = 0, r_y = 0, r_p = 0;
        for(int j = 0; j <= len ; j++)
        {
            r_x = func(x, p[j].x, dx);
            r_y = func(y, p[j].y, dy);
            if(r_x == -1 || r_y == -1)
                r_p = 0;
            else if(r_x == -2 || r_y == -2)
                r_p = 1;
            else if(r_x == r_y && r_x != -1)
                r_p = 1;
            else r_p = 0;

            if(r_p)
                break;
        }
        if(r_p)
            cout << "Yes" << endl;
        else 
            cout << "No" << endl;
    }
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值