pandasでpaiza問題(陣取りゲーム:陣取りゲーム)

スポンサーリンク

paizaへのリンク(陣取りゲーム:陣取りゲーム (paizaランク A 相当)

基本的な考え方は前の問題と同じだが、AとBのターンを管理する工夫を施す必要がある。コード内にもコメントを書いたが、ターンとqueue管理のポイントを説明しておく。

q_aは、Aが次のAのターンで処理する位置をまとめたリスト(q_bも同じ)。q_nowは今のターンで処理すべき位置のリスト。q_nextは今のターンで生成された処理すべき位置をまとめたリスト。q_nowとq_nextはターン交代時に中身を移し替える。Aだけが移動可能なマスが無くなる、ということがありえるのでターン交代時にq_nowが空だった場合の処理をしてある。

ちなみに、pandasで書いたらタイムアウトしたのでこの問題はpandasを使っていない。模範解答のコードにはDrawの処理が書いてあるが、問題の条件に照らすと必要ないと思う。下のコードは模範解答よりも少しだけ速かったので、プログラミング初心者としては嬉しい。

h, w = map(int, input().split())
turn = input()
lst1 = [list(input()) for _ in range(h)]

q_a, q_b, q_now, q_next = [], [], [], []  # queueを管理

for i in range(h):
    for j in range(w):
        if lst1[i][j] == 'A':
            q_a.append([i, j])
        if lst1[i][j] == 'B':
            q_b.append([i, j])

if turn == 'A':  # ループの最初でターン交代するのでループ前に変えておく
    turn = 'B'
else:
    turn = 'A'

while True:
    # breakpoint()
    if len(q_now) == 0:
        if turn == 'B':
            turn = 'A'
            q_now = q_a  # ターン交代でq_nowというqueueを消化する
            q_b.extend(q_next)
        else:
            turn = 'B'
            q_now = q_b
            q_a.extend(q_next)
        q_next = []
        if len(q_now) == 0:  # ABのターン交代時にqueueが空だった場合
            continue

    [y, x] = q_now[0]
    q_now.pop(0)

    if y > 0 and lst1[y - 1][x] == '.':
        lst1[y - 1][x] = turn
        q_next.append([y - 1, x])
    if y < h - 1 and lst1[y + 1][x] == '.':
        lst1[y + 1][x] = turn
        q_next.append([y + 1, x])
    if x > 0 and lst1[y][x - 1] == '.':
        lst1[y][x - 1] = turn
        q_next.append([y, x - 1])
    if x < w - 1 and lst1[y][x + 1] == '.':
        lst1[y][x + 1] = turn
        q_next.append([y, x + 1])

    if len(q_a) + len(q_b) + len(q_now) + len(q_next) == 0:
        break

num_a, num_b = 0, 0

for i in range(h):
    num_a += lst1[i].count('A')
    num_b += lst1[i].count('B')

print(num_a, num_b)
if num_a > num_b:
    print('A')
else:
    print('B')

「pandasでpaiza問題」記事一覧へのリンク

コメント

当ブログのコンテンツが気に入ったら広告ブロックの解除(ホワイトリスト化)をご検討下さい。

Please disable your adblocker or whitelist this site!

タイトルとURLをコピーしました