76. 移动游戏

Chains.Z

贴一个抄CCX大佬思路的(但是好好起名的)C++版本
PS:这题a和b最好要分开算,不然要考虑很多种情况,我自己就是这么死的

#include <stdio.h>
#include <string.h>
const int N = 111;
int dx[N] = {0},dy[N] = {0};
char order[N];
//***********************************************
int walk(int ab,int dxy,int dis_xy)//对于一次循环里的每一个状态,计算ab能否到达这一状态,第几次循环到达
{
    if(dis_xy > 0 && ab >= dxy && (ab - dxy) % dis_xy == 0)
        return (ab - dxy) / dis_xy;//等于0代表第一次循环就到达
    else if(dis_xy < 0 && ab <= dxy && (ab - dxy) % dis_xy == 0)
        return (ab - dxy) / dis_xy;//等于0代表第一次循环就到达
    else if(dis_xy == 0 && ab == dxy)
        return -2;//-2表示每次都可到达
    else
        return -1;//-1表示无法到达
}

/**********************************************/
int main(void)
{
    scanf("%s",order);
    int len=strlen(order);
    dx[0] = 0;
    dy[0] = 0;
    for(int i = 1; i <= len; i++)   //dx,dy的数量比order数加1
    {                               //遍历一次循环里能到达的状态
        dx[i] = dx[i-1];
        dy[i] = dy[i-1];
        switch(order[i-1])
        {
        case 'U':
            dy[i]++;
            break;
        case 'D':
            dy[i]--;
            break;
        case 'L':
            dx[i]--;
            break;
        case 'R':
            dx[i]++;
            break;
        }
    }
    int dis_x = dx[len];
    int dis_y = dy[len];
    //初始化完成


    int __;
    scanf("%d",&__);
    for(int _ = 0,a,b; _<__; _++) //OJ里单纯用来记问题数的量可以用下划线
    {                             //公司里不行,不然会被打 :)
        scanf("%d %d",&a,&b);
        //输入问题

        int ans = 0;
        for(int i = 0;i <= len; i++)
        {
            ans = 0;
            int can_reach_a = walk(a,dx[i],dis_x);
            int can_reach_b = walk(b,dy[i],dis_y);
            if(can_reach_a == -1 || can_reach_b == -1)//-1表示无法到达
                ans = 0;
            else if(can_reach_a == -2 || can_reach_b == -2)//-2表示每次都可到达
                ans = 1;
            else if(can_reach_a == can_reach_b)//表示在相同次循环到达
                ans = 1;
            else
                ans = 0;//表示在不同次循环到达
            if(ans)
                break;
        }
        if(ans)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
CCXXXI_

python在超时的边缘试探

x,y = 0,0
track = {(0,0)}
s = input()
for c in s: #优雅地遍历只跑一遍能到的点
    if c == 'U': y+=1
    elif c == 'D': y-=1
    elif c == 'L': x-=1
    else : x+=1
    track.add((x,y))
def f(l,t,xy): #算出能不能到,第几次循环能到
    if (xy>0 and l>=t and (l-t)%xy==0) \
    or (xy<0 and l<=t and (l-t)%xy==0):
        return (l-t)/xy
    elif xy==0 and l==t:
        return 'any'
    else: return 'noway'
q = int(input())
ans = '(ง •_•)ง' #然后卖个萌
for i in range(q):
    l=list(map(int,input().split()))
    for t in track:
        fu = f(l[0],t[0],x)
        ck = f(l[1],t[1],y)
        if fu=='noway' or ck=='noway':
            ans = 'No'
        elif fu=='any' or ck=='any':
            ans = 'Yes'
        elif fu==ck:
            ans = 'Yes'
        else:
            ans = 'No'
        if ans == 'Yes': break
    print(ans)

用pypy勉强能过

xiaoliuhai

YES好判断,NO怎么判断出来的?

Andrew-Malcom

include

using namespace std;
const int MAX=1e5+10;
int main()
{
        ios::sync_with_stdio(0);cin.tie(0);
        string s;cin>>s;
        int i,j,k;
        int dx=0,dy=0;
        for(i=0;i<s.size();++i){
                if(s[i]=='U') dy+=1;
                else if(s[i]=='D') dy-=1;
                else if(s[i]=='L') dx-=1;
                else dx+=1;
        }
        int px[MAX]={0},py[MAX]={0};
        int index=1;
        for(i=0;i<s.size();++i){
                if(s[i]=='U'){py[index]=py[index-1]+1;px[index]=px[index-1];index++;}
                else if(s[i]=='D'){py[index]=py[index-1]-1;px[index]=px[index-1];index++;}
                else if(s[i]=='L'){px[index]=px[index-1]-1;py[index]=py[index-1];index++;}
                else {px[index]=px[index-1]+1;py[index]=py[index-1];index++;}
        }
        int t;cin>>t;
        while(t--){
                int x,y,flag=0;cin>>x>>y;
                for(i=0;i<index;i++){
                        if(dx==0&&dy==0){
                                if(x==px[i]&&y==py[i]){
                                        cout<<"Yes"<<endl;
                                        flag=1;break;
                                }
                        }
                        else if(dx==0&&dy!=0){ 
                                if(x==px[i]&&(y-py[i])%dy==0&&(y-py[i])/dy>=0){
                                        cout<<"Yes"<<endl;
                                        flag=1;break;
                                }
                        }
                        else if(dx!=0&&dy==0){
                                if((x-px[i])%dx==0&&(x-px[i])/dx>=0&&y==py[i]){
                                        cout<<"Yes"<<endl;
                                        flag=1;break;
                                }
                        }
                        else{
                                if((x-px[i])%dx==0&&(y-py[i])%dy==0&&(x-px[i])/dx==(y-py[i])/dy&&(x-px[i])/dx>=0&&(y-py[i])/dy>=0){
                                        cout<<"Yes"<<endl;
                                        flag=1;break;
                                }
                        }
                }
                if(flag==0) cout<<"No"<<endl;
        }
}
你当前正在回复 博客/题目
存在问题!