SlideShare a Scribd company logo
1 of 42
Download to read offline
虫食算に学ぶ
探索アルゴリズム
@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

More Related Content

What's hot

プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
 
第21回アルゴリズム勉強会
第21回アルゴリズム勉強会第21回アルゴリズム勉強会
第21回アルゴリズム勉強会
Yuuki Ono
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
shoma h
 

What's hot (20)

区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
 
一般グラフの最大マッチング
一般グラフの最大マッチング一般グラフの最大マッチング
一般グラフの最大マッチング
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
第21回アルゴリズム勉強会
第21回アルゴリズム勉強会第21回アルゴリズム勉強会
第21回アルゴリズム勉強会
 
直前合宿 講義スライド
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライド
 
双対性
双対性双対性
双対性
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
動的計画法
動的計画法動的計画法
動的計画法
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
全域木いろいろ
全域木いろいろ全域木いろいろ
全域木いろいろ
 
素数の分解法則(フロベニウスやばい) #math_cafe
素数の分解法則(フロベニウスやばい) #math_cafe 素数の分解法則(フロベニウスやばい) #math_cafe
素数の分解法則(フロベニウスやばい) #math_cafe
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
【材料力学】静定問題と不静定問題
【材料力学】静定問題と不静定問題【材料力学】静定問題と不静定問題
【材料力学】静定問題と不静定問題
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
 
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
 

More from Kensuke Otsuki

More from Kensuke Otsuki (13)

ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
 
競プロは人生の役に立つ!
競プロは人生の役に立つ!競プロは人生の役に立つ!
競プロは人生の役に立つ!
 
人それぞれの競プロとの向き合い方
人それぞれの競プロとの向き合い方人それぞれの競プロとの向き合い方
人それぞれの競プロとの向き合い方
 
アルゴリズムを楽しく!@PiyogrammerConference
アルゴリズムを楽しく!@PiyogrammerConferenceアルゴリズムを楽しく!@PiyogrammerConference
アルゴリズムを楽しく!@PiyogrammerConference
 
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
 
JOI春季ステップアップセミナー 2021 講義スライド
JOI春季ステップアップセミナー 2021 講義スライドJOI春季ステップアップセミナー 2021 講義スライド
JOI春季ステップアップセミナー 2021 講義スライド
 
IT エンジニア本大賞 2021 講演資料
IT エンジニア本大賞 2021 講演資料IT エンジニア本大賞 2021 講演資料
IT エンジニア本大賞 2021 講演資料
 
210122 msi dp
210122 msi dp210122 msi dp
210122 msi dp
 
Optimization night 4_dp
Optimization night 4_dpOptimization night 4_dp
Optimization night 4_dp
 
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
 
ディープラーニング入門 ~ 画像処理・自然言語処理について ~
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ディープラーニング入門 ~ 画像処理・自然言語処理について ~
ディープラーニング入門 ~ 画像処理・自然言語処理について ~
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
2部グラフの最小点被覆の求め方
2部グラフの最小点被覆の求め方2部グラフの最小点被覆の求め方
2部グラフの最小点被覆の求め方
 

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