虫食算に学ぶ
探索アルゴリズム
@drken1215
1
2018年12月23日 combmofmof
易しめ 少し大変 / 42
自己紹介 Part1: 本業編
• 数理工学系出身
– 最適化, アルゴリズム
– グラフネットワーク
• 今の仕事も数理工学系
– マッチングしたり
– チャットボット作ったり
– スケジューリングしたり
2
ニューヨークネットワーク
の耐故障性評価
/ 42
自己紹介 Part2: 趣味編
• 競技プログラミング
– ゆるゆる数年
• 虫食算作り
– コミケに出店
– 今年冬は落ちた><
3 / 42
作品 1
• 「7 つの 7」で 7 の形
4 / 42
作品 2
• 竜王戦お疲れ様でした
5 / 42
作品 3: combmof
• 解けたら、もふたろうさんを mofmof する権利
6 / 42
虫食算チャレンジサイト
7
• 毎週日曜 10 時
http://musikui.sakura.ne.jp/
/ 42
虫食算を、プログラムで解く & 作る
8 / 66
大駒誠一ら著 『虫食算パズル700選』 問 698
なぜこんなことを…
9 / 42
なぜこんなことを…
10
• 楽しい
/ 42
なぜこんなことを…
11
• 楽しい
• 人生が豊かになる
/ 42
なぜこんなことを…
12
• 楽しい
• 人生が豊かになる
• 深さ優先探索 (DFS) といった、非常に重要な
アルゴリズムの基礎を学べる
/ 42
13
深さ優先探索 (DFS) は是非書こう!
/ 42
もし桁数が小さかったら…
• 桁数が予めわかっていたら、単純な全探索
でも OK
14
 ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄
/ 42
もし桁数が小さかったら…
• 桁数が予めわかっていたら、単純な全探索
でも OK
15
 ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄
/ 42
もし桁数が小さかったら…
16
a c
b
 ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄
for (int a = 1; a <= 9; ++a) {
for (int b = 0; b <= 9; ++b) {
for (int c = 1; c <= 9; ++c) {
int ue = a * 100 + 3 * 10 + b;
// 一段目
int seki1 = ue * 2;
if (seki1 < 1000) continue; // 4 桁でないとダメ
if (seki1 / 100 % 10 != 2) continue; // 100 の位が 2
// 二段目
int seki2 = ue * c;
if (seki2 >= 1000) continue; // 3 桁でないとダメ
if (seki2 % 10 != 1) continue; // 1 の位が 1
// 積
int shita = c * 10 + 2;
int seki = ue * shita;
if (seki >= 10000) continue; // 4 桁でないとダメ
// 条件を満たしたもの
cout << ue << " x " << shita << " = " << seki << endl;
}
}
}
三重の for 文
/ 42
もう少し汎用的にしたい
• 桁数が分かってなくても
– n 重の for 文的な…
– 再帰的に解くとできる
17
a c
b
 ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄
/ 42
もう少し汎用的にしたい
• 桁数が分かってなくても
– n 重の for 文的な
– 再帰的に解くとできる
18
a c
b
 ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄深さ優先探索 (DFS)
/ 42
大抵のことはグラフに変換できる
• よろしい、ならば探索だ (by chokudai さん)
• 頂点 (ノード) と、辺 (エッジ)
19 / 42
今回のだと
… … …
…
… …
… … …
20 / 42
今回のだと
… … …
…
… …
… …
21 / 42
…
今回のだと
… … …
…
… …
… …
22 / 42
…
今回のだと
… … …
…
… …
… …
23 / 42
…
今回のだと
… … …
…
… …
… …
24 / 42
…
今回のだと
… … …
…
… …
… …
25 / 42
…
今回のだと
… … …
…
… …
… …
26 / 42
…
今回のだと
… … …
…
… …
… …
27 / 42
…
今回のだと
… … …
…
… …
… …
28 / 42
…
今回のだと
… … …
…
… …
… …
29 / 42
…
今回のだと
… … …
…
… …
… …
30 / 42
…
今回のだと
… … …
…
… …
… …
31 / 42
…
今回のだと
… … …
…
… …
… …
32 / 42
…
今回のだと
… … …
…
… …
… …
33 / 42
…
今回のだと
… … …
…
… …
… …
34 / 42
…
今回のだと
… … …
…
… …
… …
35 / 42
…
今回のだと
… … …
…
… …
… …
36 / 42
…
今回のだと
… … …
…
… …
… …
37 / 42
…
今回のだと
… … …
…
… …
… …
38 / 42
…
あれを倒す
大駒誠一ら著 『虫食算パズル700選』 問 698
僅か 0.15 秒!!! (core i7, 4GB)
40 / 42
深さ優先探索 (DFS) の応用範囲
• 数独も解ける (蟻本参照!)
• フリーセルも解ける (頑張れば)
• ゲーム木探索 (将棋とか)
• メモしながら DFS すれば動的計画法 (DP) にも!
• makefile の仕組み (トポロジカルソート)
• ネットワークフローアルゴリズムのサブルーチン
– マッチングアルゴリズムなど
41 / 42
まとめ
• 虫食算は楽しい
• 深さ優先探索 (DFS) をやるといい感じ
42
http://musikui.sakura.ne.jp/
42 / 42

虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)