八皇后問題

2021-07-03 13:54:49 字數 1287 閱讀 1532

今天給大家介紹一下八皇后問題。網上介紹這個的已經很多很多了,我今天主要想說的是一種比較酸爽的解題方法。用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...