kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

ALDS1_13_A: 8 Queens Problem (続き2)

ここ

    put_queen(s, r, c)
    if rec(r + 1):
        return True
    unput_queen(s, r, c)

失敗したときは自前で状態を戻してる
コピーを作って失敗したら捨てるだけにできるといいかなあ
メモリはもったいないけど

でもnamedtupleの値をちょっとだけ変えてコピーを作る書き方がよくわからなかった
namedtuple._replace()がそれっぽいけど配列の中身まではコピーしてくれない
いったんそれぞれの配列をコピーして取り出して要素を変更してから
新しいnamedtupleを作る?そこまでめんどいもの?
こう書き換えたところでちっともうれしい気分になれない

    new_s = State(
        s.queen[:], s.row[:], s.col[:], s.dpos[:], s.dneg[:]
    )
    put_queen(new_s, r, c)
    result = rec(r + 1, new_s)
    if result:
        return result

ディープなコピーがあればそれでほぼこと足りる気もするんだけど
もうちょっと楽なやり方が用意されてるんじゃない?
そもそもnamedtupleでやってみようというのがおかしいのかな
別にクラスで書いてもdictで書いてもおなじだよなあ
いやそれとも配列を使ってるのが筋悪なの?
わからん
おしえてイミュータブルなひと

なおジャッジの結果は00.03s 6048 KBで遅くはなってない
メモリはむしろ減った
なんで