• HDU 4452 Running Rabbits 模拟


    大致题意不难理解,注意几点细节。

    转向触发条件:

    ⑴ 一个小时走完后向左转;

    ⑵ 碰到墙向后转;

    ⑶ 两只兔子都走完一个小时的路后(即当时间K为整数时),如果相遇,就交换方向,并且不再向左转。(之前一直以为走的过程中相遇也可以交换方向,一直wa)

    还有一点,题目所给的图x轴为竖直方向,y轴为水平方向,由于我不习惯这样,于是把他们换过来了。即x轴水平,y轴竖直。输出结果的时候以(y,x)形式输出。

    1,1 2,1 3,1 4,1
    1,2      
    1,3      
    1,4     4,4

    --→x

    y

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int dx[]= {0,-1,0,1}; //方向顺序为N,W,S,E。这是为了方便向左转
    int dy[]= {-1,0,1,0};
    int n;
    int time;
    
    struct Coo
    {
        int x;
        int y;
    } coo[2];
    struct Rabbit
    {
        int di;
        int v;
        int turn;
    } rabbit[2];
    
    void solve()
    {
        coo[0].x=coo[0].y=1;
        coo[1].x=coo[1].y=n;
        for(int i=1; i<=time; i++)
        {
            bool flag1=true;
            for(int j=0; j<rabbit[0].v; j++) //一步一步走,不能往前走转向
            {
                int x=coo[0].x;
                int y=coo[0].y;
                int di=rabbit[0].di;
                if((x==1 && di==1) || (x==n && di==3) || (y==1 && di==0) || (y==n && di==2))
                    rabbit[0].di=di=(di+2)%4; //向后转
                coo[0].x=x+dx[di];
                coo[0].y=y+dy[di];
            }
            for(int j=0; j<rabbit[1].v; j++)
            {
                int x=coo[1].x;
                int y=coo[1].y;
                int di=rabbit[1].di;
                if((x==1 && di==1) || (x==n && di==3) || (y==1 && di==0) || (y==n && di==2))
                    rabbit[1].di=di=(di+2)%4;
                coo[1].x=x+dx[di];
                coo[1].y=y+dy[di];
            }
            if(coo[0].x==coo[1].x && coo[0].y==coo[1].y) //两只兔子相遇
            {
                int direct;
                direct=rabbit[0].di;
                rabbit[0].di=rabbit[1].di;
                rabbit[1].di=direct;
                flag1=false;
            }
            if(i%rabbit[0].turn==0 && flag1)
                rabbit[0].di=(rabbit[0].di+1)%4; //向左转
            if(i%rabbit[1].turn==0 && flag1)
                rabbit[1].di=(rabbit[1].di+1)%4;
        }
        printf("%d %d
    %d %d
    ",coo[0].y,coo[0].x,coo[1].y,coo[1].x);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(scanf("%d",&n),n)
        {
            for(int i=0; i<2; i++)
            {
                char c;
                getchar();
                scanf("%c%d%d",&c,&rabbit[i].v,&rabbit[i].turn);
                if(c=='N')rabbit[i].di=0;       //将方向转化为数字,向左转的话+1再模4,向后转+2再模4
                else if(c=='W')rabbit[i].di=1;
                else if(c=='S')rabbit[i].di=2;
                else if(c=='E')rabbit[i].di=3;
            }
            scanf("%d",&time);
            solve();
        }
        return 0;
    }
  • 相关阅读:
    输出任意实数
    字谜游戏
    选择问题
    Spark Streaming揭秘 Day4-事务一致性(Exactly one)
    Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘
    Spark Streaming揭秘 Day2-五大核心特征
    Spark Streaming揭秘 Day1-三大谜团
    深度学习在美团搜索广告排序的应用实践
    美团外卖客户端高可用建设体系
    大众点评账号业务高可用进阶之路
  • 原文地址:https://www.cnblogs.com/pach/p/5779371.html
Copyright © 2020-2023  润新知