從一條路往前走,能進則進,不能進則退回到最近的岔路,換一條路再試。算法
在N × N的棋盤上放置N個皇后,這些皇后之間不能相互攻擊。(合法位置)編程
(圖片轉自博客園,目前未通過做者贊成,若有侵權,將當即刪除!)函數
void Put_The_Queen_On_The_NOk_Row_And_The_NOj_column(int k, int n) {//須要擺放n個皇后,當前擺放到了第k行。 int j; if(k > n)//發現可行解 print(n); //輸出可行解 else { for(j = 1;j <= n;j++) {//試探這一行的每一列 if(Find_The_Valid_Pos(k, j)) {//判斷該位置是否合法 q[k] = j; //保存位置 Put_The_Queen_On_The_NOk_Row_And_The_NOj_column(k + 1, n); //繼續試探下一行 } } } }
將一個正整數N分解成幾個正整數相加,能夠有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。編程求出正整數N的全部整數分解式子。優化
思路設計
核心代碼code
void Division(int x, int pos, int result){ static int counter, array[32]; if(result != N) { for (int i = x; result + i - 1 < N; i++) { array[pos] = i; Division(i, pos + 1, result + i); } } else{ counter++; std::cout << N << '='; for (int i = 0; i < pos - 1; i++) std::cout << array[i] << '+'; if (counter % 4 == 0 || array[pos - 1] == N) std::cout << array[pos - 1] << std::endl; else std::cout << array[pos - 1] << ';'; } }
要求blog
思路遞歸
注意圖片
輸入的目標值與全排列數的位數始終是一致的。
核心代碼
/*全局變量*/ int whole_array[32]; // 存儲當前的全排列數 int sub[32]; //記錄每個數字是否被用過 int N; //目標值 /*遞歸函數*/ void Perm (int x){ static int length = 0; //當前全排列的長度 if(N <= x - 1){ //判斷全排列樹的長度是否等於目標值 for(int i = 1;i <= N;i++) //輸出 printf("%d",whole_array[i]); printf("\n"); } else //只要全排列數的長度小於目標值 for(int i = 1;i <= N;i++) //因爲要輸出字典序,每個位置從1開始試探 if(sub[i] == 0){ //判斷這個數是否被用過 whole_array[x] = i; //將這個數 sub[i] = 1; //填入以後將這個數標記爲1,即在該全排列數中已經出現 Perm(x + 1); //到下一個位置繼續試探 sub[i] = 0; //若是發生回溯,那麼須要從新將這個數字標記爲沒有出現過 } }
(博客內容爲原創,未經容許禁止轉載!)