zoukankan      html  css  js  c++  java
  • HDU4452Running Rabbits(模拟)

    HDU4452Running Rabbits(模拟)

    题目链接

    题目大意:给NN的格子,然后有两仅仅兔子分别在(1,1)和(N, N)上。如今给这两仅仅兔子一个出发方向,和每秒跳跃格子数和每过t秒方向就向左转这些条件。

    假设这仅仅兔子跳到一定的步数碰到了墙壁。没法往那个方向跳了,那么就回头继续将剩余的步数跳完(这一点我之前没理解。

    。弄了半天)。

    假设两仅仅兔子在k点的时候在同个一个位置上。那么这两仅仅兔子就互换方向,这时候假设正好须要向左转。就不须要向左转。

    解题思路:模拟,就是须要弄清除题意。先跳再换方向。假设碰到一起的话那么就不须要换方向了,还有碰到墙壁的时候的情况也要考虑清楚。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    int N, T;
    const int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
    
    struct Rabbit {
        int d, s, t;
        int x, y;
    }r[2];
    
    int change (char ch) {
    
        if (ch == 'N')
            return 0;
        else if (ch == 'W')
            return 1;
        else if (ch == 'S')
            return 2;
        else
            return 3;
    }
    
    void jumpe (int i) {
    
        int nx = r[i].x + r[i].s * dir[r[i].d][0];
        int ny = r[i].y + r[i].s * dir[r[i].d][1];
    
        if (nx > 0 && nx <= N && ny > 0 && ny <= N) {
            r[i].x = nx;
            r[i].y = ny;
        } else {
    
            if (r[i].d == 0) 
                r[i].x += r[i].s - 2 * (r[i].x - 1);
            else if (r[i].d == 1) 
                r[i].y += r[i].s - 2 * (r[i].y - 1);
            else if (r[i].d == 2) 
                r[i].x -= r[i].s - 2 * (N - r[i].x);
            else 
                r[i].y -= r[i].s - 2 * (N - r[i].y);
    
            r[i].d = (r[i].d + 2) % 4;
        }    
    }
    
    int main () {
    
        char str[10];
        while (scanf ("%d", &N) && N ) {
    
            scanf ("%s%d%d", str, &r[0].s, &r[0].t);
            r[0].d = change(str[0]);
            scanf ("%s%d%d", str, &r[1].s, &r[1].t);
            r[1].d = change(str[0]);
            r[0].x = r[0].y = 1;
            r[1].x = r[1].y = N;
            scanf ("%d", &T);
    
            for (int i = 1; i <= T; i++) {
    
                jumpe(0);
                jumpe(1);
    
    //            printf ("%d %d
    %d %d
    ", r[0].x, r[0].y, r[1].x, r[1].y);
                if (r[0].x == r[1].x && r[0].y == r[1].y)
                    swap(r[0].d, r[1].d); 
                else {
                    if ((i % r[0].t == 0))
                        r[0].d = (r[0].d + 1) % 4;
                    if ((i % r[1].t == 0))
                        r[1].d = (r[1].d + 1) % 4;
                }
    
            }
    
            printf ("%d %d
    %d %d
    ", r[0].x, r[0].y, r[1].x, r[1].y);
        }
        return 0;
    }
  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5137245.html
Copyright © 2011-2022 走看看