1. f580.2. 骰子
    1. 題目
    2. 解法

f580.2. 骰子

f580.2. 骰子

APCS歷屆

題目

來看一下題目吧:
pic
簡單來說呢,這一題就是叫你模擬骰子的操作,並且如果a, b都是正數就兩個骰子位子交換,不過要注意的是有點容易誤解意思,如果b == -1,是只前面東西跑道下面,b == -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
68
69
# 用3*1d list去翻轉會不會很耗時間
# 或是可以考慮使用兩個1d list 去紀錄idx
# [上*4個] [旁邊的數字] [下面*4]
# 每次移動就改idx值(跑中間list)
# 前到下 後到上 上到前 下到後 也可以不用?
from sys import stdin
def up(a):
global idx, mid, back, front
old_back = back[a][0]
old_front = front[a][0]
front[a] = [mid[a][idx[a]] for i in range(4)]
if idx[a] + 2 >3:
if idx[a] == 2:
back[a] = [mid[a][0] for i in range(4)]
mid[a][0] = old_front
if idx[a] == 3:
back[a] = [mid[a][1] for i in range(4)]
mid[a][1] = old_front
else:
back[a] = [mid[a][idx[a]+2] for i in range(4) ]
mid[a][idx[a] + 2] = old_front
mid[a][idx[a]] = old_back
# old_front到對面

def right(a):
global idx
if idx[a] - 1 < 0:
idx[a] = 3
else:
idx[a] -= 1

#n, m = 1, 2
#inp = [[1, -2], [1, -1]]
#back = [3, 3, 3, 3]
#mid = [1, 2, 6, 5]
#front = [4, 4, 4, 4]
#idx = 0 #跑在mid
#right()
#print(back)
#print(mid)
#print(front)
#print(idx)
#up()
n, m = map(int, stdin.readline().split())
idx = [0 for i in range(n)]
back = [[3, 3, 3, 3] for i in range(n)]
mid = [[1, 2, 6, 5] for i in range(n)]
front = [[4, 4, 4, 4] for i in range(n)]
for i in range(m):
a, b = map(int, stdin.readline().split())
if b == -1:
up(a - 1)
elif b == -2:
right(a - 1)
else:
#print(mid[2][idx[2]])
a -= 1
b -= 1
idx[a], idx[b] = idx[b], idx[a]
back[a], back[b] = back[b], back[a]
mid[a], mid[b] = mid[b], mid[a]
front[a], front[b] = front[b], front[a]

#k = 0
for i in range(len(idx)):
if i == 0:
print(mid[i][idx[i]], end = "")
else:
print(f" {mid[i][idx[i]]}", end = "")

我的想法就是把上右左下以及前後各存一個list,並且設一個idx固定在上右左下中間跑,接著呢就是如果是b == -2我就將idx-=1(idx是上為基準),如果b == -1,我們就將上面往前面, 前面往下面, 下面往後面, 後面往上面去做調整。