回溯法和棧的思想用於「八皇后問題」的求解

2021-07-10 22:40:00 字數 1005 閱讀 8288

八皇后問題是乙個經典的問題,其核心是:在n*n的棋盤上,有n個皇后,這些皇后必須位於不同行不同列上,並且不能處於同一對角線上,否則會因相互攻擊而死亡。那麼如何安排皇后們的位置呢?

我們可以利用回溯法,先確定第乙個皇后的位置,之後進入下一行,確定第二個皇后的位置,再之後進入下一行,如果發現找不到乙個位置安排新皇后,則回退到上一行,將上一行的皇后向後移動一列,再考慮下一行的皇后,如此迴圈,直到安排好所有的皇后為止。附上一張以便於理解。

具體實現的**及所遇到的問題及解決如下:

#include

#include

#include

#define ok 1

#define error 0

#define true 1

#define false 0

typedef

int status;

/*列印答案*/

status printsolution(int *x,int n)

printf("\n");

}printf("\n");

}status isplace(int *x,int k)

return ok;

}status nqueen(int *x,int n)

}else

//x[k]如果大於n,則不必考慮此行,k--回溯到上一行

k--;

}}int main(void)

2016/4/15更新:

今天覆習了八皇后問題,在此過程中發現了不少之前忽視的問題,下面加以總結以便回顧反思。

問題主要出現在status nqueen()函式中

status nqueen(int *x,int n)

}else

i--;}}

關於八皇后問題的研究 回溯演算法

今天從早上開始就在弄回溯法,都說回溯的經典問題是八皇后問題,於是就好好看了一下八皇后的問題。找出所有的情況可能有點難,但是找出一條路來感覺應該挺簡單的。我一直都不怎麼會用遞迴,這個程式依然沒有遞迴。這個演算法主要解決八皇后問題 public class huisu02 xx yy 判斷反對角線 xx...

關於八皇后問題的研究 回溯演算法

今天從早上開始就在弄回溯法,都說回溯的經典問題是八皇后問題,於是就好好看了一下八皇后的問題。找出所有的情況可能有點難,但是找出一條路來感覺應該挺簡單的。我一直都不怎麼會用遞迴,這個程式依然沒有遞迴。這個演算法主要解決八皇后問題 public class huisu02 xx yy 判斷反對角線 xx...

八皇后問題用棧與回溯法實現

程式的演算法和思想 偽 1 建立乙個棧stack和乙個陣列int 8 8 相當於乙個8 8的棋盤 2 把第一行的八個皇后都入棧然後輸出最後乙個皇后 3 while stack.isempty 最上面的乙個皇后pop出棧,再把皇后這行和下面的行數都清為零 4 然後標記皇后為1,如果這是最後一行就輸出這...