漫画:什么是八皇后问题
轉(zhuǎn)載自?漫畫:什么是八皇后問題?
題目是什么意思呢?
國際象棋中的皇后,可以橫向、縱向、斜向移動。如何在一個8X8的棋盤上放置8個皇后,使得任意兩個皇后都不在同一條橫線、豎線、斜線方向上?
讓我們來舉個栗子,下圖的綠色格子是一個皇后在棋盤上的“封鎖范圍”,其他皇后不得放置在這些格子:
下圖的綠色格子是兩個皇后在棋盤上的“封鎖范圍”,其他皇后不得放置在這些格子:
那么,如何遵循規(guī)則,同時放置這8個皇后呢?讓我們來看看小灰的回答。
———————————
什么是八皇后問題?
八皇后問題是一個古老的問題,于1848年由一位國際象棋棋手提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,如何求解?
以高斯為代表的許多數(shù)學(xué)家先后研究過這個問題。后來,當(dāng)計算機問世,通過計算機程序的運算可以輕松解出這個問題。
如何解決八皇后問題?
所謂遞歸回溯,本質(zhì)上是一種枚舉法。這種方法從棋盤的第一行開始嘗試擺放第一個皇后,擺放成功后,遞歸一層,再遵循規(guī)則在棋盤第二行來擺放第二個皇后。如果當(dāng)前位置無法擺放,則向右移動一格再次嘗試,如果擺放成功,則繼續(xù)遞歸一層,擺放第三個皇后......
如果某一層看遍了所有格子,都無法成功擺放,則回溯到上一個皇后,讓上一個皇后右移一格,再進行遞歸。如果八個皇后都擺放完畢且符合規(guī)則,那么就得到了其中一種正確的解法。
說起來有些抽象,我們來看一看遞歸回溯的詳細(xì)過程。
1.第一層遞歸,嘗試在第一行擺放第一個皇后:
2.第二層遞歸,嘗試在第二行擺放第二個皇后(前兩格被第一個皇后封鎖,只能落在第三格):
3.第三層遞歸,嘗試在第三行擺放第三個皇后(前四格被第一第二個皇后封鎖,只能落在第五格):
4.第四層遞歸,嘗試在第四行擺放第四個皇后(第一格被第二個皇后封鎖,只能落在第二格):
5.第五層遞歸,嘗試在第五行擺放第五個皇后(前三格被前面的皇后封鎖,只能落在第四格):
6.由于所有格子都“綠了”,第六行已經(jīng)沒辦法擺放皇后,于是進行回溯,重新擺放第五個皇后到第八格。:
7.第六行仍然沒有辦法擺放皇后,第五行也已經(jīng)嘗試遍了,于是回溯到第四行,重新擺放第四個皇后到第七格。:
8.繼續(xù)擺放第五個皇后,以此類推......
八皇后問題的代碼實現(xiàn)?
解決八皇后問題,可以分為兩個層面:
1.找出第一種正確擺放方式,也就是深度優(yōu)先遍歷。
2.找出全部的正確擺放方式,也就是廣度優(yōu)先遍歷。
由于篇幅優(yōu)先,我們本篇只介紹如何找出第一種正確擺放方式。
在研究代碼實現(xiàn)的時候,我們需要解決幾個問題:
1.國際象棋的棋盤如何表示?
很簡單,用一個長度是8的二維數(shù)組來表示即可。
由于這里使用的是int數(shù)組,int的初始值是0,代表沒有落子。當(dāng)有皇后放置的時候,對應(yīng)的元素值改為1。
在這里,二維數(shù)組的第一個維度代表橫坐標(biāo),第二個維度代表縱坐標(biāo),并且從0開始。比如chessBoard[3][4]代表的是棋盤第四行第五列格子的狀態(tài)。
2.如何判斷皇后的落點是否合規(guī)?
定義一個check方法,傳入新皇后的落點,通過縱向和斜向是否存在其他皇后來判斷是否合規(guī)。
3.如何進行遞歸回溯?
遞歸回溯是本算法的核心,代碼邏輯有些復(fù)雜
4.如何輸出結(jié)果?
這個問題很簡單,直接遍歷二維數(shù)組并輸出就可以。
5.如何把這些方法串起來?
在main函數(shù)里分三步來調(diào)用:
第一步:初始化
第二步:遞歸擺放皇后
第三步:最后輸出結(jié)果。
其中Queen8是整個類的名字。
最終輸出如下:
10000000
00001000
00000001
00000100
00100000
00000010
01000000
00010000
幾點補充:
1.由于篇幅原因,這一篇只講了如何找出第一種正確的八皇后擺放。大家如果有興趣,可以對文中的代碼稍作改動,實現(xiàn)找出所有八皇后擺放的代碼。
2.本漫畫純屬娛樂,還請大家盡量珍惜當(dāng)下的工作,切勿模仿小灰的行為哦。
總結(jié)
以上是生活随笔為你收集整理的漫画:什么是八皇后问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新Volusion在2020年推出了卓越
- 下一篇: 漫画:什么是SnowFlake算法