日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

算法与数据结构(Java解八皇后问题)

發布時間:2025/3/21 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法与数据结构(Java解八皇后问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

八皇后問題


思路:

八個皇后互不沖突,即同一行同一列只能出現一位皇后。以行為標準,每一行只能放入一位皇后。可以使用一個一維數組來表示皇后的位置,一維數組的下表表示行數,一維數組中的元素表示列數。

int[] posQueen = new int[maxQueen];// posQueen = {0, 4, 7, 5, 2, 6, 1, 3} 表示在第一位皇后在第1行, 第1列;第二位皇后在第2行,第5列,以此類推...

當放入第n位皇后時,前面(n-1)行已經有皇后了,所以需要判斷第 n 位皇后是否與前(n-1)位沖突。所以需要有一個檢測沖突的函數:

//檢測第n個皇后是否和前面沖突private boolean check(int n) {for (int i=0; i<n; i++) {if (posQueen[n] == posQueen[i] //在同一列||Math.abs(n-i) == Math.abs(posQueen[n]-posQueen[i])) //在正、反對角線上{ return false;}}return true;}

寫好了檢測沖突方法,就可以考慮開始放入皇后了,在這里用遞歸可以找出所有的可行解:

//放置第n個皇后private void place(int n) {//檢測是否所有皇后已放好if (n==8) {count++;display();return;}//依次放入皇后,并判斷是否沖突for(int i=0; i<maxQueen; i++) {//先把當前皇后放在第1列posQueen[n] = i;//判斷是否沖突if (check(n)) {//不沖突,進入下一層place(n+1);} //沖突,檢查本行的下一個位置是否可行,即進入for循環的下一位}}

以5皇后舉例說明:

這個方法需要輸入當前第幾個皇后正在被放置,在開始時我們會輸入0(也就是放置第1位皇后)。

  • 首先會檢測5位皇后是否已經被放好,否,進行下一步,將第1位皇后放在第1行的第1列上,用{0,0,0,0,0}表示此時的狀態;
    然后判斷是否沖突,否,進入下一層循環,放置第2位皇后;
  • 先檢測5位皇后是否都被放好,否,將第2位皇后放在第2行第1列上,沖突;
    將第2位皇后右移一位,放在第2行第2列上,沖突;
    將第2位皇后右移一位,放在第2行第3列上,不沖突,此時狀態為{0,2,0,0,0}
    進入下一層循環,放置第3位皇后;
  • 先檢測5位皇后是否都被放好,否,將第3位皇后放在第3行第1列上,沖突;
    將第3位皇后右移一位,放在第3行第2列上,沖突;

    將第3位皇后右移一位,放在第3行第5列上,不沖突,此時狀態為{0,2,4,0,0}
    進入下一層循環,放置第四位皇后;
  • 同理,狀態為{0,2,4,1,0},進入下一層循環,放置第5位皇后;
  • 同理,當for循環到i=4時,狀態為{0,2,4,1,3},第5位皇后不沖突,進入下一層循環;
  • 因為5位皇后都已經被放置好,因此 if 檢測為 true,輸出第一組合理排列;
    返回到上一層循環中,即回到第5步,并繼續第5步(因為上一次第5步只檢查到第5行第4列);
  • 直接從for循環的i=5開始,將第5位皇后放在第5行第5列上,沖突;
    這一輪搜索結束,退回上一層,即第4步,從for循環的i=2開始,重復上述過程;
  • 直到返回第1步,從for循環的i=1開始,重復第2-7步
  • 最終會遍歷所有位置,找出所有的組合方式

  • 圖解:

    先從最后一行開始遍歷;然后回到上一行,遍歷;直到回到第一行



    完整代碼

    public class Queen {//皇后的數量int maxQueen = 5;//皇后的位置數組,例:{0, 4, 7, 5, 2, 6, 1, 3}int[] posQueen = new int[maxQueen];//解法總數量int count = 0;//檢測第n個皇后是否和前面沖突private boolean check(int n) {for (int i=0; i<n; i++) {if (posQueen[n] == posQueen[i] || Math.abs(n-i) == Math.abs(posQueen[n]-posQueen[i])) {return false;}}return true;} //放置第n個皇后private void place(int n) {//檢測是否所有皇后已放好if (n==maxQueen) {count++;display();return;}//依次放入皇后,并判斷是否沖突, i表示當前皇后放置在第n+1行第i+1列for(int i=0; i<maxQueen; i++) {//先把當前皇后放在第1列posQueen[n] = i;//判斷是否沖突if (check(n)) {//不沖突,進入下一層place(n+1);} //沖突,檢查本行的下一個位置是否可行,即進入for循環的下一位}} //打印結果private void display() {System.out.println("第"+count+"種解法:");int[][] result = new int[posQueen.length][posQueen.length];for(int i=0; i<posQueen.length; i++) {result[i][posQueen[i]] = 1;for (int j=0; j<posQueen.length; j++) {System.out.print(result[i][j]+" ");}System.out.println(); }}public static void main(String[] args) {Queen queen = new Queen();queen.place(0);System.out.println(queen.maxQueen+"皇后問題一共有"+queen.count+"種解法。");}}

    相關章節
    第一節 簡述
    第二節 稀疏數組 Sparse Array
    第三節 隊列 Queue
    第四節 單鏈表 Single Linked List
    第五節 雙向鏈表 Double Linked List
    第六節 單向環形鏈表 Circular Linked List
    第七節 棧 Stack
    第八節 遞歸 Recursion
    第九節 時間復雜度 Time Complexity
    第十節 排序算法 Sort Algorithm
    第十一節 冒泡排序 Bubble Sort
    第十二節 選擇排序 Select Sort
    第十三節 插入排序 Insertion Sort
    第十四節 冒泡排序,選擇排序和插入排序的總結
    第十五節 希爾排序 Shell’s Sort
    第十六節 快速排序 Quick Sort
    第十七節 歸并排序 Merge Sort

    總結

    以上是生活随笔為你收集整理的算法与数据结构(Java解八皇后问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。