八皇后問題的總結與擴充套件

2021-08-28 04:10:21 字數 1475 閱讀 8099

八皇后問題是在乙個8*8的棋盤內,如何放置8個互不衝突的皇后。我們知道,皇后可以橫、直、斜不限距離移動。我們基本上用的是回溯解決此類問題,我這兩天看到了不少的八皇后問題解題辦法。在我看來,比較高明的解題辦法是這種:

public

class queen

public

void

backtrack(int i)else

} system.out.println();

}}else}}

}public

static

void

main(stringargs)

}

它的解題思路是 一排一排的安排棋子 然後列出三個陣列 分別代表縱列 右斜縱列 左斜縱列 這樣就可以定位乙個棋子後確認該棋子控制哪些區域 比如 我們在第一行第一列 布下乙個棋子 那麼縱列陣列column[1]=1 右斜縱列rup[2]=1 左斜縱列lup[8] =1 所以之後的安排棋子就不能選擇這三排 至於為什麼斜縱列的陣列為16

明白了吧 而且陣列是從rup[2]開始計算數的(第一行第一列的例子 上一段的內容)

這樣順延下去 答案就出來了

那麼 我們為什不做一點擴充套件的思考呢?如果是七個皇后和乙個城堡(橫、直不限距離移動)呢?

如果按上面的思路來的話,在確定城堡的位置後它可以控制的位置只有縱列。但是這其實不對 因為有侷限性 請看圖

在圖中 已經確定了第乙個棋子皇后 第二個棋子城堡的位置 它們控制的區域我分別用1 2 來表示 在第三個棋子時 發現了嗎? 如果是在2.0的位置時 第二個皇后就能吃了城堡 這與我們的體意相違背 所以在設定城堡的控制的區域時斜方向也要管 **如下

`

public

class queen

public

void

backtrack(int i, int n)

if(i>8&&flag==1)

else

}else

}system.out.println();

}flag = 0;

}else

column[j]=rup[i+j]=lup[i-j+8]=1;

backtrack(i +1, n); //迴圈呼叫

column[j]=rup[i+j]=lup[i-j+8]=0;}}

}}public

static

void

main(stringargs)

}

結果是736 也就是92*8 你發現了嗎? 7個皇后已經確認了最後乙個棋子的位置了,最後也就只是乙個排列組合 換換位置而已 。

謝謝**!!!

擴充套件的八皇后問題

問題是乙個古老而著名的問題,是 回溯演算法 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的 西洋棋 上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在 柏林的象棋雜誌上不同的作者發表...

八皇后問題擴充套件版 c

任意大小棋盤,任意數量的皇后 include include using namespace std const int num 8 方形棋盤行數 const int qnum 8 加入皇后的個數 int a num 1 存放棋盤資訊的陣列,陣列號代表行號,對應陣列值代表列號 static int ...

n皇后問題與八皇后

這裡的n皇后問題指在乙個nxn的棋盤上放置n個棋子,使得每行每列和每條對角線上都只有乙個棋子,求其擺放的方法數。當且僅當n 1 或 n 4 時問題有解。class queens vector vector res int result 0 bool test int cur for int i 0 ...