ACM hdu N皇后問題

2022-09-23 10:00:08 字數 1471 閱讀 7387

time limit : 2000/1000ms (j**a/other) memory limit : 32768/32768k (j**a/other)

total submission(s) : 11 accepted submission(s) : 3

font: times new roman | verdana | georgia

font size: ← →在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

你的任務是,對於給定的n,求出有多少種合法的放置方法。

共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。185

019210cgf2008 hznu programming contest

思路分析:

本題用到了遞迴,一遇到遞迴就頭疼,不知道遞迴到**去了。針對該題,我把n=4的情況,把遞迴完全跑了一遍,在紙上畫來畫去,終於對該題遞迴的過程有了一定的理解。在遞迴的同時也進行回溯。下面**中行數和列數均是從0開始的。這裡寫思路為了好理解,我們認為行數和列數均是從1開始的。整體思路是一行一行的放,在每一行中一列一列的放。這裡的n設為4,先放第一行,從第一列開始,外層乙個迴圈,從第1列到第n列,但是程式還沒有跑到第n列(這裡,第一行放在第一列就符合題意),**中乙個遞迴,就跳到第二行裡去了search(1+1),該放第二行了,外層乙個迴圈,從第1列到第n列,再用乙個for迴圈檢查放的位置是否合適,第二行放在第一列肯定不行(和第一行同列),放在第二列也不行(和第一行對角線),放在第三列可以,這時候外層迴圈也沒有跑完,就進入了乙個新的遞迴,跳到第三行裡去了search(2+1),該放第三行了,外層乙個迴圈,放在第一列不行,第二列也不行,第三列也不行,第四列也不行。迴圈結束,沒有執行裡面的search(3+1),第三行**也不能放,回溯,又跑到第二行的狀態去,還記得第二行裡面的那個外層迴圈沒有跑完嗎,上面跑到了第三列,於是接著迴圈,放在第四列,可以放,又進入乙個新的遞迴,search(2+1),即剛才說的**都不能放的第三行,又乙個迴圈,從第一列開始放,第一列不行,第二列可以,這時候在第三行外層迴圈在第二列的時候,又進入了新的遞迴search(3+1),尋找下一行,接著又乙個外迴圈。。。。如果不行,又跳到第三行。。。接下來就不說了,已經說了這麼多,大體的流程就是這樣的,不斷的遞迴,不斷的回溯,(因為上一行的迴圈還沒有執行完)。

**:#include

#include

using namespace std;

int c[11],tot,n;

void search(int cur)//不符合條件就回溯

{ int i,j;

if(cur==n) tot++;//當search(n-1)時也成功,說明有符合題意的情況,所以search(n-1)裡面有search(n)執行時,tot++

else for(i=0;i>n&&n)

{cout<

問題 I n皇后問題

在n n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2 個皇后不放在同一行或同一列或同一斜線上。設計乙個解n 後問題的佇列式分支限界法,計算在n n個方格上放置彼此不受攻擊的n個皇...

八皇后問題 2n皇后問題

問題描述 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處在同一行 同一列或同一斜線上。解決思路 解決八皇后問題不難,主要是應用到了遞迴回溯的方法,本質上也是一種列舉法。從棋盤的第一行開始嘗試擺放第乙個皇后,擺放成功之後,遞迴一層,再遵循規則在棋盤第二行來擺放第二個皇后。如...

n皇后問題與八皇后

這裡的n皇后問題指在乙個nxn的棋盤上放置n個棋子,使得每行每列和每條對角線上都只有乙個棋子,求其擺放的方法數。當且僅當n 1 或 n 4 時問題有解。class queens vector vector res int result 0 bool test int cur for int i 0 ...