SlideShare uma empresa Scribd logo
1 de 12
Baixar para ler offline
アルゴリズム+データ構造
勉強会(14)
2013-05-26 アロハ)竹腰 彰成
第14回 8クイーン問題
8クイーン問題とは
• チェス盤に8つのクイーンを置く
• クイーンがそれぞれ取られないように並べられ
れば成功
• クイーンは縦横ななめの8方向にどこまでも進めら
れる(飛車と角行を合わせた動き)
• 何通りかの解があることがわかっている
• 全部で92通り。鏡像・回転を除くと12通り
• これをコンピュータですべての解を導く
図はWikipediaより
力まかせ探索
力まかせ探索とは
• 別名「しらみつぶし探索」
• 8つのクイーンを配置した全部のパターンをチェックすれば解ける
•
64!
64−8 !
=
64!
56!
= 64 ∗ 63 ∗ 62 ∗ 61 ∗ 60 ∗ 59 ∗ 58 ∗ 57
= 178,462,987,637,760通り
• コンピュータがきわめて高速なら使えることもあるが、あまり実用的
ではない
• 1秒間に1,000,000,000通りを確認できるなら178,462秒=約2日で解ける
• それでも、まずはこれでやってみる(高速化は次回行う)
8クイーンの基本フロー(1)
1. 初期化
2. for (各配置パターン全部回るような条件) {
1. パターンを配置する();
2. If (クイーンが取り合いできないことを確認()) {
1. パターンを表示する
3. }
3. }
• まず、どうやって条件を判定するか
チェス盤の表現方法
• チェス盤を2重配列で表現することにする
for ($y = 0; $y < 8; $y++) {
for ($x = 0; $x < 8; $x++) {
$chessboard[$y][$x] = 0;
}
}
• クイーンがあれば1、なければ0とする
クイーン同士が取り合えないことを確認(1)
• 横にチェックしたとき、同じ筋に2つクイーンがあるとアウト。0個または1
つならセーフ
function check_yoko($chessboard)
{
for ($y = 0; $y < 8; $y++) {
$count = 0;
for ($i = 0; $i < 8; $i++) {
$count += $chessboard[$y][$i];
}
if ($count >= 2) {
return false;
}
}
return true;
}
クイーン同士が取り合えないことを確認(2)
• 同じように縦筋、ななめ筋もチェックする関数を作り、まとめて呼び出
せば完成
function check_chessboard($chessboard)
{
return check_tate($chessboard)
&& check_yoko($chessboard)
&& check_naname($chessboard);
}
※ななめ筋のチェックはすこし面倒
8クイーンの基本フロー(2)
1. 初期化
2. for (各配置パターン全部回るような条件) {
1. パターンを配置する();
2. If (check_chessboard()) {
1. パターンを表示する
3. }
3. }
• 次に、どうやってパターンを配置するか
力技で配置
• 全パターンを配置するのはちょっと大変。「横方向に2つ置けない」ので、
$chessboard[$y][$x]のうち$yを固定してしまう。
for ($x0; $x0 < 8; $x0++) {
$chessboard[0][$x0] = 1;
for ($x1; $x1 < 8; $x1++) {
$chessboard[1][$x1] = 1;
for ($x2; $x2 < 8; $x2++) {
(省略)
for ($x7; $x7 < 8; $x7++) {
$chessboard[7][$x7] = 1;
if (check_chessboard($chessboard[7][$x7])) {
print_chessboard();
}
$chessboard[7][$x7] = 0; // ループ内で同じ横筋に2個置かないように取り除く
}
(省略)
実習
• ここまでの内容を踏まえて、力まかせ探索で8クイーン問題を解いて
ください
• 全部表示するには数日かかるので、1つでも表示されたら動くだろうという程
度のテストでOKです
• 次回はこれを高速化します。そのため、実装を完成させてください。
• 来週はお休みし、再来週に次回を行います。
• どうしても解けない場合でも「クイーンを互いに取り合えないことの確認」関
数は作ってください。

Mais conteúdo relacionado

Destaque

アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)noldor
 
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)noldor
 
とりあえずはじめるChatOps
とりあえずはじめるChatOpsとりあえずはじめるChatOps
とりあえずはじめるChatOps正貴 小川
 
Study 20131009
Study 20131009Study 20131009
Study 20131009fujii_t
 
アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)noldor
 
アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)noldor
 
アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)noldor
 
アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)noldor
 
Code igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイントCode igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイントnoldor
 
AWSをテラフォーミングする会(Terraformハンズオン)
AWSをテラフォーミングする会(Terraformハンズオン)AWSをテラフォーミングする会(Terraformハンズオン)
AWSをテラフォーミングする会(Terraformハンズオン)正貴 小川
 
Mackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LTMackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LTMasahiro Nagano
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTMasahiro Nagano
 
Big Master Data PHP BLT #1
Big Master Data PHP BLT #1Big Master Data PHP BLT #1
Big Master Data PHP BLT #1Masahiro Nagano
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Masahiro Nagano
 
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月Masahiro Nagano
 
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
ISUCONの勝ち方 YAPC::Asia Tokyo 2015ISUCONの勝ち方 YAPC::Asia Tokyo 2015
ISUCONの勝ち方 YAPC::Asia Tokyo 2015Masahiro Nagano
 
Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発Hidekazu Nakamura
 
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Yohei Yasukawa
 
Information sharing and Experience consistency at Cookpad mobile application
Information sharing and Experience consistency at Cookpad mobile applicationInformation sharing and Experience consistency at Cookpad mobile application
Information sharing and Experience consistency at Cookpad mobile applicationichiko_revjune
 

Destaque (20)

アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)
 
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
 
とりあえずはじめるChatOps
とりあえずはじめるChatOpsとりあえずはじめるChatOps
とりあえずはじめるChatOps
 
Study 20131009
Study 20131009Study 20131009
Study 20131009
 
アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)
 
アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)
 
アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)
 
アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)
 
Code igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイントCode igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイント
 
AWSをテラフォーミングする会(Terraformハンズオン)
AWSをテラフォーミングする会(Terraformハンズオン)AWSをテラフォーミングする会(Terraformハンズオン)
AWSをテラフォーミングする会(Terraformハンズオン)
 
Mackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LTMackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LT
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
 
Big Master Data PHP BLT #1
Big Master Data PHP BLT #1Big Master Data PHP BLT #1
Big Master Data PHP BLT #1
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
 
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
 
Sakura IoT Platform
Sakura IoT PlatformSakura IoT Platform
Sakura IoT Platform
 
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
ISUCONの勝ち方 YAPC::Asia Tokyo 2015ISUCONの勝ち方 YAPC::Asia Tokyo 2015
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
 
Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発
 
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)
 
Information sharing and Experience consistency at Cookpad mobile application
Information sharing and Experience consistency at Cookpad mobile applicationInformation sharing and Experience consistency at Cookpad mobile application
Information sharing and Experience consistency at Cookpad mobile application
 

アルゴリズム+データ構造勉強会(14)