八皇后(JAVA算法實現)


  在學習現代軟件工程構建之法這門課時,老師要求發表一篇博客,使用JAVA算法實現八皇后問題的求解。寫這篇博客時,我學習了一些其他的博客,自己無法解決時,向他人學習也是一種方法。

  國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

  我們可以逐行或者逐列來進行可行擺放方案的遍歷,每一行(或列)遍歷出一個符合條件的 位置,接着就到下一行或列遍歷下一個棋子的合適位置,這種遍歷思路可以保證我們遍歷過程中有一個條件是絕對符合的——就是下一個棋子的擺放位置與前面的棋 子不在同一行(或列)。接下來,我們只要判斷當前位置是否還符合其他條件,如果符合,就遍歷下一行(或列)所有位置,看看是否繼續有符合條件的位置,以此 類推,如果某一個行(或列)的所有位置都不合適,就返回上一行(或列)繼續該行(或列)的其他位置遍歷,當我們順利遍歷到最后一行(或列),且有符合條件 的位置時,就是一個可行的8皇后擺放方案,累加一次八皇后可行方案的個數,然后繼續遍歷該行其他位置是否有合適的,如果沒有,則返回上一行,遍歷該行其他 位置,依此下去。這樣一個過程下來,我們就可以得出所有符合條件的8皇后擺放方案了。這是遞歸思路。

   接下來,我們以逐列遍歷,具體到代碼,進一步說明。首先,從第一列開始找第一顆棋子的合適位置,我們知道,此時第一列的任何一個位置都是合適的,當棋子找 到第一個合適的位置后,就開始到下一列考慮下一個合適的位置,此時,第二列的第一行及第二行顯然就不能放第二顆棋子了,因為其與第一個棋子一個同在一行, 一個同在一條斜線上。第二列第三行成為第二列第一個合適的位置,以此類推,第三列的第5行又會是一個合適位置,這個過程中,我們注意到,每一列的合適位置 都是受到前面幾列的位置所影響,假設前面1列的棋子放在第3行,那當前列不能放的位置就一定是3行,2行,4行。例如用cols數組來表示8個列棋子所放的行數,數組下標從0開始,其中數組下標表示列數,數組的元素值表示該列棋子所在行數,當前列為N(N>=0,N<8),則:

  cols[N] != cols[N-1]

  cols[N] != cols[N-1]-1

  cols[N]!=cols[N-1]+1

  如果N-2列存在的話,那么我們還要考慮當前列N不與N-2列的棋子同行,同斜線,同反斜線。把當前列N的前面的某一列設為m,則m的所有取值為{m>=0,m<N}的集合,則:

  cols[N] != cols[m]

  cols[N] != cols­­[m] -(N-m)

  cols[N] != cols­­[m] + (N-m)
  具體代碼如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM