1959. 奶牛芭蕾
摘要
Title: 1959. 奶牛芭蕾
Tag: 模拟、旋转
Memory Limit: 64 MB
Time Limit: 1000 ms
Powered by:NEFU AB-IN
1959. 奶牛芭蕾
-
题意
见原题
-
思路
前置知识:
- 旋转问题
若向量头部位于原点,顺时针旋转θ度
- 坐标系
- 数组坐标系:
- 真实坐标系:
- 数组坐标系:
思路就是模拟,每次模拟完判断是否出界,并更新边界值
(当移动时,要找准正方向,根据这个正方向进行移动)
- 旋转问题
-
代码
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))