アルゴリズムとデータ構造 補足資料 10-2
「 n クイーン」
横浜国立大学 理工学部 数物・電子情報系学科 富井尚志
バックトラックアルゴリズム
• とりあえずやってみる
• ダメなら戻って別の道を探る
– あのとき別の道を選んでいたら、、、
• 試行錯誤( trial and error )
– 結局全部のケースをやってみる(完全解)
n クイーン( n-queens )
• チェスの「クイーン」
• チェスの「クイーン」、 n x n の盤面上で、
n 個 のクイーンが
お互 いに取らない
(効き
筋にならない)
よう に配置
n クイーン( n-queens )
• この問題を解くためのデータ構造
n クイーン( n-queens )
• この問題を解くためのデータ構造
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
• 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
• この問題を解くためのデータ構造
• すでに効き筋
→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
• この問題を解くためのデータ構造 配列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
• この問題を解くためのデータ構造 配列 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
• この問題を解くためのデータ構造 配列 3 :
q_sw[col+row]
南西斜め筋は
col+row が一定!
n クイーン( n-queens )
TRUE