zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/pach/p/5779371.html
Copyright © 2011-2022 走看看