1. g276.2. 魔王迷宮
    1. 看題目
    2. 實作

g276.2. 魔王迷宮

g276.2. 魔王迷宮

apcs歷屆

看題目

pic
簡單來說,每個魔王會在(r, c)的位置,下一回合會移動到(r + c, c + t),每次移動前會放下炸彈,但是如果超出範圍的話,或是移動到有炸彈的地方魔王就死掉,然後要輸出魔王全部死後還剩多少炸彈,要注意的就是,如果同一回合魔王跳到同一個炸彈,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
# put bomb -> new bomb
# move daemon -> new daemon
# explode(bomb, daemon) -> new bomb, daemon
# bomb = set() daemon = [[0, 0, 0, 0]]格式
bomb = set()
def put(daemon, bomb):
for i in daemon:
bomb.add((i[0], i[1]))
#return bomb
def move(daemon): #移動到指定地方 先不對炸彈做事情
new = []
for i in daemon:
if 0 <= i[0] + i[2] < n and 0 <= i[1] + i[3] < m: #只有在棋盤內的
new.append([i[0] + i[2], i[1] + i[3], i[2], i[3]])
return new
def explode(bomb, daemon):
rm = set()
new =[]
for i in daemon:
if (i[0], i[1]) in bomb:
rm.add((i[0], i[1]))
else:
new.append(i)
for i in rm: #炸彈刪掉
if i in bomb:
bomb.discard(i)
return new
n, m, k = map(int, input().split())
daemon = []
for i in range(k):
daemon.append(list(map(int, input().split())))
while len(daemon) != 0:
put(daemon, bomb)
daemon = move(daemon)
daemon = explode(bomb, daemon)
print(len(bomb))

有點難理解對吧?我也覺得,這一次我們用到的資料結構是set,我這幾天有寫過那篇文章,大家可以前後翻一下(我的部落格可以前後直接翻),我們寫了3個def,第一個呢,是放炸彈,就是離開前在位置上放炸彈,啊有重複的保持所以用set,再來,第二個是將牠放到指定的地方,不過這一步沒有要對炸彈做事情喔~我們針對每個魔王的位置照著題目改,順便檢查有沒有超過範圍(提醒一下,我們的輸入格式是[r, c, s, t]),最後一個function,就是爆炸,我們為了避免有第二個魔王要炸,所以創了一個rm的set,也有一個保留下來的list(要注意list才能修改),再來就是要區分一下有沒有碰到炸彈,最後再用discard炸掉就好囉。

設定完輸入後,設一個while,如果還有惡魔就開始跑。