程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU4452Running Rabbits(模擬)

HDU4452Running Rabbits(模擬)

編輯:C++入門知識

HDU4452Running Rabbits(模擬)


HDU4452Running Rabbits(模擬)

題目鏈接

題目大意:給N?N的格子,然後有兩只兔子分別在(1,1)和(N, N)上。現在給這兩只兔子一個出發方向,和每秒跳躍格子數和每過t秒方向就向左轉這些條件。如果這只兔子跳到一定的步數碰到了牆壁,沒法往那個方向跳了,那麼就回頭繼續將剩余的步數跳完(這一點我之前沒理解。。弄了半天)。如果兩只兔子在k點的時候在同個一個位置上,那麼這兩只兔子就互換方向,這時候如果正好需要向左轉,就不需要向左轉。

解題思路:模擬,就是需要弄清除題意,先跳再換方向,如果碰到一起的話那麼就不需要換方向了,還有碰到牆壁的時候的情況也要考慮清楚。

代碼:

#include 
#include 
#include 

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\n%d %d\n", 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\n%d %d\n", r[0].x, r[0].y, r[1].x, r[1].y);
    }
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved