通過上一次的學習可以知道,如果要實現乙個遞迴函式,那麼必須要有兩個東西。————遞迴邊界和遞迴式。
遞迴邊界用於返回最簡單的底層的結果。
遞迴式用於減小資料規模並向下一層遞迴。
其實學到這裡才發現,遞迴才是計算機思維,雖然說起來簡單,但是正常人的思維模式是不按照遞迴走的。
今天要研究的是n皇后問題,是回溯演算法的典型題,於19世紀被提出。
八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。
也就是輸入整數n(這裡是八),求出n個西洋棋在n*n的棋盤上的位置。
#include
#include
using
namespace
std;
int n;
int queenpos[100];//用來存放算好的皇后位置,最左上角為(0,0)
void nqueen(int k)//在0--k-1行皇后已經擺好的情況下,推算k行及以上的擺法
for(i=0;i//逐個嘗試第k個皇后的位置
int j;
for(j=0;j//和已經擺好的k-1個皇后比較,看合不合適
if(queenpos[j]==i||abs(queenpos[j]-i)==abs(k-j))
} if(j == k)
}} int main()
演算法學習 N皇后問題
問題 d 八皇后 時間限制 1 sec 記憶體限制 32 mb 題目描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a...
演算法學習之路 N皇后問題
n皇后問題,在棋盤上放n個皇后,要求互相之間不能攻擊,求問有多少種情況 輸入格式 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。輸出格式 共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。輸入樣例 18 50輸出樣例 192 10八皇后問題的拓展,回溯...
演算法學習筆記 遞迴
漢諾塔問題 有種說法我覺得很好,所謂遞迴,就是利用大道至簡的思想,把乙個大的複雜的問題層層轉換為乙個小的和原問題相似的問題來求解的這樣一種策略。優點缺點 遞迴給人的感覺是驚豔,它往往能給我們帶來非常簡潔非常直觀的 形勢,從而使我們的編碼大大簡化。效率往往很低,費時和費記憶體空間。在遞迴呼叫的過程當中...