アルゴリズムとデータ構造 補足資料 10-2 「 n クイーン」
DESCRIPTION
アルゴリズムとデータ構造 補足資料 10-2 「 n クイーン」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. バックトラックアルゴリズム. とりあえずやってみる ダメ なら戻って別の道を探る あの とき別の道を選んでいたら 、、、 試行錯誤( trial and error ) 結局全部のケースをやってみる(完全解). n クイーン( n-queens ). チェスの「 クイーン 」. n クイーン( n-queens ). チェスの「 クイーン 」 、 n x n の盤面上で、 n 個のクイーンが - PowerPoint PPT PresentationTRANSCRIPT
アルゴリズムとデータ構造補足資料 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 = 4row 行
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 = 4row 行
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 = 4row 行
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 = 4row 行
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
col-row=-1FALSE FALSE FALSE TRUE TRUE
FALSE
col-row=-1FALSE FALSE FALSE FALSE
FALSE FALSE
col-row=-1FALSE TRUE TRUE
TRUE FALSE TRUE
col-row=-1FALSE TRUE
column 列 col = 0 col = 1 col = 2 col = 3 col = 4row 行
row = 0
row = 1
row = 2
row = 3
row = 4
• この問題を解くためのデータ構造配列 3 :q_sw[col+row]
南西斜め筋はcol+row が一定!
n クイーン( n-queens )TRUE FALSE TRUE
col+row=-3
FALSE 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 = 4row 行
row = 0
row = 1
row = 2
row = 3
row = 4
• この問題を解くためのデータ構造配列: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
• バックトラックによる解法配列: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
• バックトラックによる解法配列: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
FALSEFALSE FALSE FALSE FALSE
FALSE
FALSE
FALSE
FALSE
• バックトラックによる解法配列: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
FALSEFALSE FALSE FALSE FALSE
FALSE
A FALSE
B FALSE
C FALSE
• バックトラックによる解法配列:q_pos[col]=row
とりあえず Aq_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
• バックトラックによる解法配列: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
• バックトラックによる解法配列: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
• バックトラックによる解法配列:q_pos[col]=row
とりあえず Aq_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
• バックトラックによる解法配列: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
• バックトラックによる解法この場合にはうまくいっていますが、次の候補がなければキャンセルして前に戻る(バックトラック)
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
• チェスの「クイーン」、 n x n の盤面上で、 n 個のクイーンがお互いに取らない (効き筋にならない)ように配置• 考え方:– とりあえず、置いてみる。– 行き詰ったら、前に戻って(バックトラック)、別の選択肢でやってみる。
n クイーン( n-queens )