最近看演算法,那些個回溯演算法,總結起來可以一句話:撞了南牆就回頭,回到撞牆以前的狀態,總能找到路到羅馬。既然到了羅馬,我就知道來時的路。有點像《源**》的情節,男主一死就往回,起死回生,再來一次,最後順利找出**。
經典的回溯比如八皇后,二叉樹求和的路徑,陣列的全排列,問題就不描述了,**貼上下,留個念想。
八皇后
#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回溯演算法
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...