結果

問題 No.61 リベリオン
ユーザー rpy3cpprpy3cpp
提出日時 2015-07-28 02:20:27
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,627 bytes
コンパイル時間 296 ms
コンパイル使用メモリ 86,880 KB
実行使用メモリ 80,072 KB
最終ジャッジ日時 2023-09-23 04:17:58
合計ジャッジ時間 1,953 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 79 ms
71,484 KB
testcase_01 AC 77 ms
71,012 KB
testcase_02 AC 78 ms
71,196 KB
testcase_03 WA -
testcase_04 WA -
testcase_05 AC 76 ms
71,076 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

def solve(X, Y, D, Mx, My, Hx, Hy, Vx, Vy):
    if Vx == 0:
        return can_hit(Y, D, My, Hy, Vy)
    if Vy == 0:
        return can_hit(X, D, Mx, Hx, Vx)
    x0, y0 = Hx, Hy
    dx, dy = Vx, Vy
    d = 0
    while d < D:
        if hit(Mx, My, Hx, Hy, Vx, Vy, D):
            return True
        if d and returned(x0, y0, dx, dy, Hx, Hy, Vx, Vy):
            return False
        Hx, Hy, Vx, Vy, d = move(Hx, Hy, Vx, Vy, d, X, Y)
    return False

def can_hit(Z, D, Mz, Hz, Vz):
    t1 = (Mz - Hz) / Vz
    if t1 >= 0:
        return t1 <= D
    if Vz > 0:
        Hz = 2 * Z - Hz
    else:
        Hz = - Hz
    t2 = - (Mz - Hz) / Vz
    return t2 >= 0 and t2 <= D

def hit(tx, ty, x, y, dx, dy, D):
    ddx = tx - x
    ddy = ty - y
    if ddx * dy - ddy * dx:
        return False
    t = ddx/dx
    return t >= 0 and t <= D

def returned(x0, y0, dx, dy, Hx, Hy, Vx, Vy):
    if dx != Vx or dy != Vy:
        return False
    return (x0 - Hx) * dy - (y0 - Hy) * dx == 0

def move(Hx, Hy, Vx, Vy, d, X, Y):
    if Vx > 0:
        if Vy > 0:
            tmp = (Y-Hy)*Vx - (X-Hx)*Vy
            if tmp >= 0:  # 右辺にぶつかる
                d = (X - Hx)/Vx
                Hx = 2*X - Hx
                Vx = -Vx
            elif tmp <= 0:  # 上辺にぶつかる
                d = (Y - Hy)/Vy
                Hy = 2*Y - Hy
                Vy = -Vy
        else:
            tmp = (0-Hy)*Vx - (X-Hx)*Vy
            if tmp >= 0:  # 下辺にぶつかる
                d = -Hy/Vy
                Hy = -Hy
                Vy = -Vy
            elif tmp <= 0:  # 右辺にぶつかる
                d = (X - Hx)/Vx
                Hx = 2*X - Hx
                Vx = -Vx
    else:
        if Vy > 0:
            tmp = (Y-Hy)*Vx - (0-Hx)*Vy
            if tmp >= 0:  # 上辺にぶつかる
                d = (Y - Hy)/Vy
                Hy = 2*Y - Hy
                Vy = -Vy
            elif tmp <= 0:  # 左辺にぶつかる
                d = (0 - Hx)/Vx
                Hx = - Hx
                Vx = -Vx
        else:
            tmp = (0-Hy)*Vx - (0-Hx)*Vy
            if tmp >= 0:  # 左辺にぶつかる
                d = -Hx/Vx
                Hx = -Hx
                Vx = -Vx
            elif tmp <= 0:  # 下辺にぶつかる
                d = -Hy/Vy
                Hy = -Hy
                Vy = -Vy
    return Hx, Hy, Vx, Vy, d
        
if __name__ == '__main__':
    Q = int(input())
    for q in range(Q):
        X, Y, D, Mx, My, Hx, Hy, Vx, Vy = map(int, input().split())
        if solve(X, Y, D, Mx, My, Hx, Hy, Vx, Vy):
            print('Hit')
        else:
            print('Miss')
0