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

Kensuke Otsuki
Kensuke OtsukiResearcher at NTT DATA MSI
虫食算に学ぶ
探索アルゴリズム
@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
1 of 42

More Related Content

What's hot(20)

TriangulerTrianguler
Trianguler
Ken Ogura3K views
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
AtCoder Inc.8.3K views
Topological sortTopological sort
Topological sort
HCPC: 北海道大学競技プログラミングサークル7.4K views
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
AtCoder Inc.16.8K views
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル3.3K views
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライド
tozan gezan3.9K views
AtCoder Regular Contest 028 解説AtCoder Regular Contest 028 解説
AtCoder Regular Contest 028 解説
AtCoder Inc.5.8K views
直交領域探索直交領域探索
直交領域探索
okuraofvegetable12.3K views
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
AtCoder Inc.16.1K views
辺彩色辺彩色
辺彩色
Ken Ogura8.9K views
abc032abc032
abc032
AtCoder Inc.22.9K views
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
AtCoder Inc.19.5K views

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