Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
数独ではじめるアルゴリズム 第一章 実装と高速化
Search
Ryosuke Uchiyama
September 25, 2020
Programming
0
120
数独ではじめるアルゴリズム 第一章 実装と高速化
Ryosuke Uchiyama
September 25, 2020
Tweet
Share
More Decks by Ryosuke Uchiyama
See All by Ryosuke Uchiyama
AWSでサーバレスな書籍管理アプリを作る
step63r
0
5
PythonでSlack通知botを作る
step63r
0
2
ChatGPT実践
step63r
1
280
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
3
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
2
深層強化学習で東方AI 第一章 DQNの基本
step63r
0
150
Build 2021 プレイバック
step63r
0
27
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
step63r
0
36
WPFで実践アプリ開発! 第三章 機能の実装 Part 1
step63r
0
100
Other Decks in Programming
See All in Programming
Ruby on Railroad: The Power of Visualizing CFG
ydah
0
290
Laravel × Clean Architecture
bumptakayuki
PRO
0
140
Browser and UI #2 HTML/ARIA
ken7253
2
170
Boost Your Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
770
音声プラットフォームのアーキテクチャ変遷から学ぶ、クラウドネイティブなバッチ処理 (20250422_CNDS2025_Batch_Architecture)
thousanda
0
390
生成AIで知るお願いの仕方の難しさ
ohmori_yusuke
1
100
開発者フレンドリーで顧客も満足?Platformの秘密
algoartis
0
170
大LLM時代にこの先生きのこるには-ITエンジニア編
fumiyakume
8
3.3k
UMAPをざっくりと理解 / Overview of UMAP
kaityo256
PRO
3
1.4k
2025-04-25 GitHub Copilot Agent ライブデモ(スクリプト)
goataka
0
100
Instrumentsを使用した アプリのパフォーマンス向上方法
hinakko
0
230
flutter_kaigi_mini_4.pdf
nobu74658
0
140
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
780
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.3k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
4 Signs Your Business is Dying
shpigford
183
22k
How STYLIGHT went responsive
nonsquared
100
5.5k
Building an army of robots
kneath
305
45k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.4k
Why Our Code Smells
bkeepers
PRO
336
57k
Transcript
数独ではじめるアルゴリズム 第一章 実装と高速化 Ryosuke Uchiyama step63r
はじめに
数独ってなに? 3✕3✕3のマスに1~9の数字を入れていくペンシルパズル 5 3 7 6 1 9 5 9
8 6 8 6 3 4 8 3 1 7 2 6 6 2 8 4 1 9 5 8 7 9 問題例 5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7 9 1 7 1 3 9 2 4 8 5 6 9 6 1 5 3 7 2 8 4 2 8 7 4 1 9 6 3 5 3 4 5 2 8 6 1 7 9 解答
手筋1 特定のマスに入る数値を絞る ★ 5 6 7 2 3 4 8
9 • ボックスより (2, 3, 4) は✕ • ヨコより (5, 6, 7) は✕ • タテより (8, 9) は✕ ★に入るのは 1 だけ! A B C 1 2 3 1 2 3 4 5 6 7 8 9
手筋2 特定の数値が入るマスを絞る 1 1 ★ 2 1 • C1の 1
でA1の1行目が潰れる • B1の 1 でA1の2行目が潰れる • A2の 1 でA1の3列目が潰れる 1 が入るのは★だけ! A B C 1 2 3
経緯
その昔……
step63r/NumpreTool02: Resolve NUMPRE (Number Place) automatically.
None
ところが……
None
None
None
_人人人人人人人人人_ > 解答できません <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
Software Design 8月号 技術評論社 Software Design 2020年8月号|技術評論社
ここに書かれていることをやってみました
探索アルゴリズム
グラフ構造と深さ優先探索(DFS) 0 1 2 3 4 11 5 8 6
7 9 10 12 13 14
数独の盤面をグラフ化 ※ここでは単純化のため3✕3の盤面で考える 2 3 1 2 1 2 2 3
1 2 2 1 2 2 3 1 3 2 1 2 2 3 1 3 2 1 1 2 2 3 1 3 2 2 1 2 2 3 1 3 2 3 1 2 2 3 1 1 2 1 2 2 3 1 1 2 1 1 2 2 3 1 1 2 2 1 2 2 3 1 1 2 3 1 2 2 3 1 1 2 3 1 1 2 2 3 1 1 2 3 2 1 2 2 3 1 1 2 3 3 1 2
実装してみた SudokuCpp python-sudoku
Demo
高速化
ベンチマーク(Python版) 4 9 2 4 8 2 1 4 6
6 9 4 8 3 1 3 5 6 7 7 5 6 2 6 1 3 5 2 中級クラス 0.6955 秒 2 1 8 4 9 6 3 1 2 7 9 6 4 6 9 3 7 専門級クラス 110.6565 秒 ※Intel Core i7-10700 @2.90 GHz 空きマスが増えるにつれて処理時間が長くなってしまう
改善アプローチ その1 入れられる数字の選択肢が少ないマスから埋めていく その2 一意に決まるマスはあらかじめ埋めておく
入れられる数字の選択肢が少ないマスから埋めていく 3 6 5 4 8 7 9 4 5
1 9 7 3 5 6 8 9 6 5 4 4 6 5 5 6 5 3 5 3 4 5 6 5 3 4 4 4 6 5 5 5 4 4 5 5 5 4 4 5 5 5 4 7 3 3 4 3 4 4 5 6 4 4 5 6 5 4 4 6 4 5 7 7 4 6 7 7 5 6 6 8 問題 入れられる数字の残数 ここから処理するよりも… この辺から処理した方が速い!
一意に決まるマスはあらかじめ埋めておく 3 6 5 4 8 7 9 4 5
1 9 7 3 5 6 8 9 問題 5 8 3 6 5 4 8 7 5 9 4 6 5 9 1 5 9 7 3 5 6 8 5 9 5 前処理後の問題
ベンチマーク比較(Python版) 測定不可(時間かかりすぎ) 1080.966 281.378 5.0795 0 200 400 600 800
1000 1200 対策なし 対策1 対策2 対策1&2 最高級クラスを30問解くのにかかった時間 (秒)
まとめ
たまにはゴリゴリ書くのも楽しいよ!!!!!!!!
今後やること • UI実装(WPFかXamarinあたり) • モバイル対応(iOSアプリをビルドする環境がない……つらたん……) • OCR(問題をカメラで撮ってAzure Cognitive Servicesとかで盤面認識&自動解答) •
マルチスレッド(たぶんやらないやつ)