八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
![](https://pic.w3help.cc/270/4fb95d12c9f786454e7ffb1cedd6c.jpeg)
解題思路:
棋盤一共八行八列,按照列的原則放置這八個皇后,從第一列選擇某乙個位置放置第乙個皇后,然後從第二列選擇某乙個位置放置第二個皇后,……依此放置下去。
要滿足的條件就是:第一列可以任意選擇位置放置;第二列選擇的位置不能和第一列的皇后在同一行,同一斜線上;第三列選擇的位置不能和第一列,第二列的皇后在同一行,同一斜線上;……依此類推下去
所以可以採用遞迴的方法來解決問題
具體思路如下:
放置第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...