回溯的那些個演算法

2021-06-19 04:23:58 字數 1850 閱讀 8361

最近看演算法,那些個回溯演算法,總結起來可以一句話:撞了南牆就回頭,回到撞牆以前的狀態,總能找到路到羅馬。既然到了羅馬,我就知道來時的路。有點像《源**》的情節,男主一死就往回,起死回生,再來一次,最後順利找出**。

經典的回溯比如八皇后,二叉樹求和的路徑,陣列的全排列,問題就不描述了,**貼上下,留個念想。

八皇后

#include #include #define n 8

int column[n+1];

int rup[2*n+1];

int lup[2*n+1];

int queen[n+1]=;

int num;

void backtrack(int);

int main()

void backtrack(int i)

}else}}

}

二叉樹求和

#include#include#include using namespace std;

static int sum(0);

static int count(0);

templatestruct binode

;templateclass bitree

;private:

binode*root;

void create(binode* &bt);

void release(binode*bt);

int depth(binode* bt);

int findpath(t i, binode* bt, stack*> &sta);

};template void bitree::release(binode*bt)

}//先序遍歷構建樹

template void bitree::create(binode* &bt)

}template int bitree::depth(binode* bt)

int d1 = depth(bt->lchild);

int d2 = depth(bt->rchild);

return (d1 > d2 ? d1 : d2)+ 1;

}//採用回溯法查詢路徑

template int bitree::findpath(t i, binode* bt, stack*> &sta)

sum += bt->data;

if (sum == i && bt->lchild == null && bt->rchild == null)//當求到和且左子樹和右子數都為空也就是到了葉節點時,就找到了解

cout << endl;

count ++;

} //當沒有到葉節點時,繼續找。

if (null != bt->lchild)

if (null != bt->rchild)

//回溯時,需要回到之前的狀態,所以要減去sum,並且彈棧。

sum -= bt->data;

sta.pop();

return count;

}int main()

列印陣列的全排列

#include using namespace std;

void swap(int &a,int &b)//交換連個元素

int sum=0;

void cal(int *a,int first,int end)

{ if(first == end)//如果遞迴到深層時,到最後交換的元素即時最後乙個元素時就列印出來

{sum++;

for(int i = 0; i <= end; i++)

cout<

那些個po,vo啊

po persistant object持久物件 最形象的理解就是乙個po就是資料庫中的一條記錄。好處是可以把一條記錄作為乙個物件處理,可以方便的轉為其它物件。bo business object業務物件 主要作用是把業務邏輯封裝為乙個物件。這個物件可以包括乙個或多個其它的物件。比如乙個簡歷,有教育...

Mac上的那些個快捷鍵們

入了mac的坑,在為其魅力折服的同時,不免時不時的會有一些揮之不去的痛點。其實在mac上有一大堆的快捷鍵,可以讓你的效率有乙個質的提高。command option alt shift caps lock control ctrl tab 顯然,快捷鍵量很大,全部記住並熟練應用不太可能,可以根據自己...

回溯 leetcode回溯演算法

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...