Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マインスイーパーSolverの話

gott
February 08, 2019

 マインスイーパーSolverの話

UTMC( http://www.komaba.utmc.or.jp/ )で話した内容です。

gott

February 08, 2019
Tweet

Other Decks in Technology

Transcript

  1. 非自明な安全マス (0, 1)はすでに爆弾が確定したマス。 a = (1, 1), b = (2,

    1), c = (3, 1) d = (1, 2), e = (2, 2), f = (3, 2) cから出発したとする。 cの周りの爆弾配置は右の 2通り。 relates(c, f) ∧ relates(b, f)なので, b,続いてaについて調べる。 aについて調べると,左は矛盾する。
  2. 変な工夫 double default_probability = (double)countNotFixedBombs() / board.count( (i) -> !i.isOpen()

    & !i.isFixed() && !i.isSafe() , this); // なにも情報がないマスに爆弾がある確率 if (min_prob < default_probability - BIAS) { min_cell.setSafe(); return true; } BIAS = 0.014で一番勝率が高くなった
  3. 書き方の話: 素の制御構文をたくさん書くな 例えばこんなfor文をたくさん書くとする。 for (int i = n - 1;

    i >= 0; i--) { /*...*/ } 一箇所でも赤が抜けると黙ってバグる。 こうしよう。 this.board.numEdge.forEach((i) -> { i.relatedEdges = new BoardCellSet(); i.getIterator(this).apply_around((j) -> j.isBoxEdge() && i.relatedEdges.add(j.getCell())); });
  4. 書き方の話: 抽象化 public class ProbPlayer extends Player このクラスのmainメソッドがエントリポイント。 Playerはコンパイル済みのライブラリ内にある。 player.open(int

    x, int y) を呼ぶと親クラスであるPlayerの public final boolean open(int x, int y) が呼ばれ,実際に(x, y)マスを開ける処理が走る。 →何が問題か?