• 検索結果がありません。

アルゴリズムとデータ構造 補足資料 10-2 「 n クイーン」

N/A
N/A
Protected

Academic year: 2021

シェア "アルゴリズムとデータ構造 補足資料 10-2 「 n クイーン」"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズムとデータ構造 補足資料 10-2

「 n クイーン」

横浜国立大学 理工学部 数物・電子情報系学科 富井尚志

(2)

バックトラックアルゴリズム

• とりあえずやってみる

• ダメなら戻って別の道を探る

– あのとき別の道を選んでいたら、、、

• 試行錯誤( trial and error )

– 結局全部のケースをやってみる(完全解)

(3)

n クイーン( n-queens )

• チェスの「クイーン」

(4)

• チェスの「クイーン」、 n x n の盤面上で、

n 個 のクイーンが

お互 いに取らない

(効き

筋にならない)

よう に配置

n クイーン( n-queens )

(5)

• この問題を解くためのデータ構造

n クイーン( n-queens )

(6)

• この問題を解くためのデータ構造

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(7)

• この問題を解くためのデータ構造

• すでに効き筋

→FALSE

• queen を置ける

→TRUE

n クイーン( n-queens )

TRUE

FALSE TRUE FALSE TRUE

FALSE FALSE FALSE TRUE TRUE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE TRUE TRUE

TRUE FALSE TRUE FALSE TRUE column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(8)

• この問題を解くためのデータ構造

• すでに効き筋

→FALSE

• queen を置ける

→TRUE

これを

2

次元配列で

書いてもよいが、ここでは 次の

3

つの配列で表現

n クイーン( n-queens )

TRUE

FALSE TRUE FALSE TRUE

FALSE FALSE FALSE TRUE TRUE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE TRUE TRUE

TRUE FALSE TRUE FALSE TRUE column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(9)

• この問題を解くためのデータ構造 配列1:

q_row[row]

その行に queen が いるときに FALSE いないときに TRUE

n クイーン( n-queens )

TRUE

FALSE TRUE FALSE TRUE

FALSE FALSE FALSE TRUE TRUE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE TRUE TRUE

TRUE FALSE TRUE FALSE TRUE column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(10)

• この問題を解くためのデータ構造 配列 2 :

q_se[col-row+N-1]

南東斜め筋は

col-row が一定!

n クイーン( n-queens )

TRUE

FALSE TRUE FALSE TRUE row=-1 col-

FALSE FALSE FALSE TRUE TRUE

FALSE

row=-1 col-

FALSE FALSE FALSE FALSE

FALSE FALSE

row=-1 col-

FALSE TRUE TRUE

TRUE FALSE TRUE

col- row=-1

FALSE TRUE column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(11)

• この問題を解くためのデータ構造 配列 3 :

q_sw[col+row]

南西斜め筋は

col+row が一定!

n クイーン( n-queens )

TRUE

FALSE TRUE

col+row

FALSE =-3 TRUE

FALSE FALSE

col+row

=-3

FALSE TRUE TRUE

FALSE

col+row

=-3

FALSE FALSE FALSE FALSE col+row

=-3

FALSE FALSE FALSE TRUE TRUE

TRUE FALSE TRUE FALSE TRUE column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(12)

• この問題を解くためのデータ構造 配列:

q_pos[col]=row この配列だけ、

前の 3 つと値が 異なることに注意

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(13)

• バックトラックによる解法 配列:

q_pos[col]=row に、とりあえず 置いてみる。

q_pos[0]=0

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

(14)

• バックトラックによる解法 配列:

q_pos[col]=row に、とりあえず 置いてみる。

q_pos[0]=0

効き筋を埋める

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE

FALSE FALSE FALSE FALSE

FALSE

FALSE

FALSE

FALSE

(15)

• バックトラックによる解法 配列:

q_pos[col]=row に、とりあえず 置いてみる。

次の候補は A, B, C

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE

FALSE FALSE FALSE FALSE

FALSE

A FALSE

B FALSE

C FALSE

(16)

• バックトラックによる解法 配列:

q_pos[col]=row とりあえず A q_pos[1]=2

に置いてみる

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE FALSE FALSE FALSE FALSE

FALSE

FALSE

FALSE

FALSE

(17)

• バックトラックによる解法 配列:

q_pos[col]=row とりあえず A

効き筋チェック

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

FALSE FALSE

(18)

• バックトラックによる解法 配列:

q_pos[col]=row とりあえず A 次の候補は A

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

A FALSE FALSE

(19)

• バックトラックによる解法 配列:

q_pos[col]=row とりあえず A q_pos[2]=4

に置いてみる

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

FALSE FALSE

(20)

• バックトラックによる解法 配列:

q_pos[col]=row とりあえず A

効き筋チェック

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE FALSE

FALSE FALSE FALSE FALSE FALSE

(21)

• バックトラックによる解法 この場合には

うまくいっていますが、

次の候補がなければ キャンセルして

前に戻る

(バックトラック)

n クイーン( n-queens )

column

col = 0 col = 1 col = 2 col = 3 col = 4 row

row = 0

row = 1

row = 2

row = 3

row = 4

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE

FALSE FALSE FALSE FALSE FALSE

FALSE FALSE FALSE FALSE

FALSE FALSE FALSE FALSE FALSE

(22)

• チェスの「クイーン」、 n x n の盤面上で、

n 個のクイーンがお互いに取らない (効き筋にならない) ように配置

• 考え方:

– とりあえず、置いてみる。

– 行き詰ったら、前に戻って(バックトラック)

、別の選択肢でやってみる。

n クイーン( n-queens )

参照

関連したドキュメント

東京工業大学

東京工業大学

情報理工学研究科 情報・通信工学専攻. 2012/7/12

関東総合通信局 東京電機大学 工学部電気電子工学科 電気通信システム 昭和62年3月以降

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

 当図書室は、専門図書館として数学、応用数学、計算機科学、理論物理学の分野の文

清水 悦郎 国立大学法人東京海洋大学 学術研究院海洋電子機械工学部門 教授 鶴指 眞志 長崎県立大学 地域創造学部実践経済学科 講師 クロサカタツヤ 株式会社企 代表取締役.

静岡大学 静岡キャンパス 静岡大学 浜松キャンパス 静岡県立大学 静岡県立大学短期大学部 東海大学 清水キャンパス