NOI八皇后問題

2021-09-29 17:26:03 字數 1005 閱讀 7922

#include

//做此題前一定明白一點,八個皇后一定在不同的行和列,所以每行一定會有乙個皇后。

#include

#include

#include

int q[9]

;//用乙個陣列來記錄下皇后的位置,陣列的下標代表行數,陣列的值代表列數。

using

namespace std;

int p=0;

void

queen

(int k)

//遞迴函式,用遞迴的思想是假設要擺的那一行的前面全都已經擺好,再擺這一行,倘若能擺下,那麼用遞迴進入下一行的擺放。

cout<}return;}

for(

int i=

0;i<8;

++i)

//本題的靈魂迴圈。此處的i代表列數。我想可能有部分朋友剛剛學習遞迴會有跟我當時一樣的疑問,寫乙個這樣的迴圈怎麼會可以判斷到所有的情況呢?那其實可以列舉一下兩種種情況。第一種:假如完成了八行的擺放,如何進行下一次?顯然,完成之後會立即return到上一次呼叫的時候,也就是queen(k+1)的時候,以往下走,就會讓最後一行嘗試下乙個位置,倘若沒有,則會通過正常的函式括號的出口出去再回到上一次呼叫的地方嘗試上乙個的其他位置,以此類推,會嘗試所有情況。那麼第二種情況其實有一部分就包含在剛才說的成功的情況當中:如果發現此行已經嘗試了,所有列都不行那麼也會通過函式的花括號自然出口返回到上一行,進行其他位置的嘗試。那麼如果所有位置都走過了,都返回到第一行的最後一列了,也就是第一行的位置都走到最後一列了,這個時候再返回就返回到main函式去了,這個時候所有的情況就輸出了。總結一下,因為這個迴圈將0到7行的所有列的情況都遍歷了,從第0行為起點開始遞迴,那麼遞迴中不管在哪返回,都會進入在這個迴圈中嘗試別的位置,所以它會嘗試所有的情況。

if(j==k)

//如果不是break出來的,那麼j必定等於k,反之必定不等於,所以若不是break出來的代表此位置可行。}}

intmain()

八皇后問題

八皇后問題 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...