バックトラック法〜pythonを使う(続)

  • こちらにパズルを解くパイソンコードの解説があった
  • パイソンの練習がてら、なぞってみる
  • コピペをしても動かないので、いまいちなのだけれど…コメントをいただきまして、1行修正して回りました。
  • いくつか学ぶこと
    • Classの作り方
      • クラスオブジェクトを作るのが "__init__"
      • そのときに"self"という予約語(のようなもの)を使うこと→この"self"は引数のように書いてあるけれど、実際の引数はs,tだけであること:"Piece('010111010', 311)"と使えば、"010111010"がs、311がtに相当する
      • "self.hoge"で、作ったクラスオブジェクトの属性を取り出せること
      • その他
        • np.array(...).reshape(h,-1)の "-1"は列数としては、「不適切」だが、そういうときは、"h(行数)"に合わせて「よしなに値をとれ」という意味に解釈されるらしい
import numpy as np
class Piece:
    def __init__(self, s, t):
        h = t // 100 # 縦
        m = (t // 10) % 10 # 反転する(2)/しない(1)
        n = t % 10 # 回転数
        #a = np.array(1).reshape(h, -1)
        a = np.array([c != '0' for c in s]).reshape(h, -1)
        self.pos = -1
        self.sel = 0
        self.cand = []
        for i in range(m):
            for j in range(n):
                self.cand.append((a, a.argmax()))
                a = np.rot90(a)
            a = np.fliplr(a)
    • バックトラックのおよその動き
      • 組み合わせを作って
      • 判定をしながら、ダメになったら、組み合わせのうち、ダメをもたらす部分を共有しているところは全はしょり