1959. 奶牛芭蕾

摘要
Title: 1959. 奶牛芭蕾
Tag: 模拟、旋转
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1959. 奶牛芭蕾

  • 题意

    见原题

  • 思路

    前置知识

    • 旋转问题
      rotate
      若向量头部位于原点,顺时针旋转θ度
      rotate2
    • 坐标系
      • 数组坐标系:
        1
      • 真实坐标系:
        2

    思路就是模拟,每次模拟完判断是否出界,并更新边界值

    (当移动时,要找准正方向,根据这个正方向进行移动)

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    '''
    Author: NEFU AB-IN
    Date: 2022-05-19 15:25:15
    FilePath: \ACM\Acwing\1959.py
    LastEditTime: 2022-05-19 17:22:10
    '''
    from collections import Counter


    def rotate(a, b): # ab 向量顺时针旋转90度
    b[0] -= a[0]
    b[1] -= a[1]

    x = b[1]
    y = -b[0]

    return [x + a[0], y + a[1]]


    n = int(input())

    d = Counter() # 初始化坐标
    turn = Counter() # 每一次前进的方向,相对于目前正方向的偏移量

    d['FL'] = [0, 1]
    d['RL'] = [0, 0]
    d['FR'] = [1, 1]
    d['RR'] = [1, 0]

    turn['F'] = 0
    turn['B'] = 2
    turn['L'] = 3
    turn['R'] = 1

    dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 上右下左

    face = 0 # 0朝北,1朝东,2朝南,3朝西
    minx, maxx, miny, maxy = 0, 1, 0, 1

    for i in range(n):
    s = input()
    feet = s[:2]
    op = s[-1]

    if op == 'P':
    for key in d.keys():
    if key != feet:
    d[key] = rotate(d[feet], d[key])
    face = (face + 1) % 4
    else:
    id = (face + turn[op]) % 4
    d[feet][0] += dir[id][0]
    d[feet][1] += dir[id][1]

    for k1 in d.keys():
    for k2 in d.keys():
    if k1 != k2 and d[k1] == d[k2]:
    print(-1)
    exit(0)

    for k in d.keys():
    minx = min(minx, d[k][0])
    maxx = max(maxx, d[k][0])
    miny = min(miny, d[k][1])
    maxy = max(maxy, d[k][1])

    print((maxx - minx + 1) * (maxy - miny + 1))
使用搜索:谷歌必应百度