八皇后問題

2021-08-16 04:33:07 字數 1924 閱讀 2136

八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

解題思路:

棋盤一共八行八列,按照列的原則放置這八個皇后,從第一列選擇某乙個位置放置第乙個皇后,然後從第二列選擇某乙個位置放置第二個皇后,……依此放置下去。

要滿足的條件就是:第一列可以任意選擇位置放置;第二列選擇的位置不能和第一列的皇后在同一行,同一斜線上;第三列選擇的位置不能和第一列,第二列的皇后在同一行,同一斜線上;……依此類推下去

所以可以採用遞迴的方法來解決問題

具體思路如下:

放置第n列的皇后時,先遍歷該列前面所有的皇后的位置,然後確定該列的八個格仔哪些格仔是不可以放置的(也就是會和前n列的皇后在同一行,同一斜線的所有位置),那麼剩下的也自然就是可以放置的位置

例如:

上圖的第4列在選擇位置時,先遍歷該列前面的所有皇后的位置,然後確定該列哪些格仔不可以放置,那麼剩下的就是可以放置的位置。

如此放置下去,就可以找出所有的解決方案

錯誤方案的情況就是某一列在選擇位置時,發現該列的八個格仔都不可放置,那麼該方案就是錯誤方案

終止條件就是所有列都能找到位置放置皇后,這就是乙個可行的解決方案。

採用一維陣列存放每一列的皇后的位置,陣列下標表示列,值表示行。

遞迴的核心**如下:

每次遞迴的引數是一維陣列place:皇后的放置位置,n: 本次需要尋找第幾列的皇后位置

boolean findplace(int place,int n)else

}system.out.println();

}return

true;

}// 尋找到第n列不可以放置的點,把不可放置的位置置為-1

int cache = new

int[pi];

for(int i = 1; i < n ; i++)

// 尋找可以放置的點,也就是遍歷陣列cache中不為-1的點

for (int i = 0; i < cache.length; i++) }}

}

以上是遞迴的核心**部分。

以下是完整**:

public

class 八皇后

private

static boolean findplace(int place,int n)else

}system.out.println();

}return

true;

}// 尋找到第n列不可以放置的點

int cache = new

int[pi];

for(int i = 1; i < n ; i++)

// 尋找可以放置的點

for (int i = 0; i < cache.length; i++) }}

return

false;}}

執行結果如下:

總共有92種解決方案。

當然,改變上面**中的pi的值,就可以得到九皇后,十皇后,….的解決方案,例如設定pi=10,執行結果如下:

總共有724種解決方案。

八皇后問題

八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...

八皇后問題

include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...

八皇后問題

package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...