今天給大家介紹一下八皇后問題。網上介紹這個的已經很多很多了,我今天主要想說的是一種比較酸爽的解題方法。用c++在10行內寫出八皇后。解這種題還是得用回溯。
大家先看一下下面比較正常的解題**吧。
#include
#define n 8
using namespace std;
int arr[n+1]=;
bool canplace(int k)
void print()
arr[index]=0;
--index;
}}void eightqueen_2(int
index)
}int main(int argc,char **argv)
這個也比較簡單,沒什麼好說的,大家注意看下面的。
#include
#include
#include
#include
#include
int main() ; ::std::next_permutation(queens,queens+8); )
if ((::std::bitset
<15>(::std::accumulate(queens,queens+8, ::std::make_pair(0, 0), (::std::pair a, int b)).first).count() == 8) && (::std::bitset
<15>(::std::accumulate(queens, queens+8, ::std::make_pair(0, 0), (::std::pair a, int b)).first).count() == 8))
::std::cout
<< queens[0] << queens[1] << queens[2] << queens[3] << queens[4] << queens[5] << queens[6] << queens[7] << ::std::endl;
}
這個才是最酸爽的,哈哈!
思路呢,我簡單地給大家提示一下,其實我也是看了好久才明白的。主要用了c++的lambda表示式和標準庫提供的一些函式。next_permutation函式會產生 0 1 2 3 4 5 6 7的全排列。所以我們現在需要做的就是檢測某個排列是否衝突。在同一行和同一列的情況已經不用考慮了,所以要檢測呢就是檢測是否在同一條對角線上。實際上用兩個函式就可以表達是否在同一條對角線了咩。
y=x+b y=-x+b
提示到這了,大家自己想吧。
參考資料:
八皇后問題
八皇后問題 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...