1. 程式人生 > >全面解析回溯法:演算法框架與問題求解

全面解析回溯法:演算法框架與問題求解

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int* data;

int is_a_solution(int a[],int k, int step);
//void construct_candidates(int a[],int k,data input, int c[],int *ncandidates);
void process_solution(int a[],int n,int step, data input,data output);
//void make_move(int a[],int k, data input);
//void unmake_move(int a[],int k,data inupt); int LowerBound(int *CakeArray,int n); int UpperBound(int n); void Reverse(int CakeArray[],int begin,int end); void generate_sort(int a[],int n); void show(data output); static int maxStep; //is_sorted() int is_a_solution(int *CakeArray,int n,int step) {
int i; for(i=1;i<n;i++) if(CakeArray[i-1]>CakeArray[i]) return 0; if(step<maxStep) return 1; return 0; } void process_solution(int a[],int n,int step,data input,data output) { int i; maxStep = step; printf("new maxStep:%d\n",maxStep);
for(i=0;i<step;i++) output[i] = input[i]; return; } int UpperBound(int n) { return 2*(n-1); } int LowerBound(int *CakeArray,int n) { int i,t,ret = 0; for(i=1;i<n;i++) { t = CakeArray[i-1] - CakeArray[i]; if((t==1)||(t==-1)) continue; else ret++; } return ret; } void Reverse(int CakeArray[],int begin,int end) { assert(end>begin); int i,j,t; for(i=begin,j=end;i<j;i++,j--) { t = CakeArray[i]; CakeArray[i] = CakeArray[j]; CakeArray[j] = t; } } backtrack(int a[],int n,int step, data input,data output) { int i; if(step+LowerBound(a,n)>maxStep) return; if(is_a_solution(a,n,step)) process_solution(a,n,step,input,output); else { //construct_candidates(a,k,input,c,&ncandidates); for(i=1;i<n;i++) { Reverse(a,0,i);//make_move(a,k,input); input[step] = i; backtrack(a,n,step+1,input,output); Reverse(a,0,i);//unmake_move(a,k,input); } } } void generate_sort(int a[],int n) { maxStep = UpperBound(n); int *SwapArray = malloc((UpperBound(n)+1)*sizeof(int)); int *minSwapArray = malloc((UpperBound(n)+1)*sizeof(int)); backtrack(a,n,0,SwapArray,minSwapArray); show(minSwapArray); } void show(data output) { int i; for(i=0;i<maxStep;i++) printf("%d",output[i]); printf("\n"); return ; } int main() { int i,n; printf("number of pancake:"); scanf("%d",&n); int *CakeArray = malloc(n*sizeof(int)); printf("pancakes' order(continuously):\n"); for(i=0;i<n;i++) scanf("%d",&CakeArray[i]); printf("searching...\n"); generate_sort(CakeArray,n); return 0; }

相關推薦

全面解析回溯演算法框架問題求解

#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int* data; int is_a_solution(int a[],int k, int step); //void

回溯演算法分析設計)

0.回溯法的演算法框架 A.簡介 回溯法,又稱試探法。一般需要遍歷解空間,時間複雜度概況:子集樹Ω(2^n),排序樹Ω(n!),暴力法 B.回溯法解題三步驟 1)定義問題的解空間 如0-1揹包問題,當n=3時,解空間是(0,0,0)、(0,0,1)、(0,1,0

回溯演算法框架

回溯法 子集樹 程式碼如下: def constraint(): # 約束函式 return True def bound(): # 限界函式 retu

回溯的解題步驟例子解析

    回溯法有“通用解題法”之稱。用它可以系統地搜尋問題的所有解。回溯法是一個既帶有系統性又帶有跳躍性的搜尋演算法。     在包含問題的所有解的解空間樹中,按照深度優先搜尋的策略,從根結點出發深度

回溯求和

要求 int 示例 push UNC mes std include class 題目描述 輸入兩個整數 n 和 m,從數列1,2,3.......n 中隨意取幾個數,使其和等於 m ,要求將其中所有的可能組合列出來 輸入描述: 每個測試輸入包含2個整數,n和m 輸出描述

第八次作業聚類--K均值算自主實現sklearn.cluster.KMeans調用

ans 運行 port 輸出結果 info 對數 num 函數 () import numpy as np x = np.random.randint(1,100,[20,1]) y = np.zeros(20) k = 3 def initcenter(x,k):

聚類--K均值算自主實現sklearn.cluster.KMeans調用

return 判斷 flag space image from .data cluster 改變 1.K-means是一個反復叠代的過程,算法分為四個步驟: (1)選取數據空間中的K個對象作為初始中心,每個對象代表一個聚類中心; (2)對於樣本中的數據對象,根據它們與這些聚

【JVM第九篇】Executor框架執行緒池

Executor框架簡介 在Java 5之後,併發程式設計引入了一堆新的啟動、排程和管理執行緒的API。Executor框架便是Java 5中引入的,其內部使用了執行緒池機制,它在java.util.cocurrent 包下,通過該框架來控制執行緒的啟動、執行和關閉,可以簡化併發程式設計

輸出拓撲排序的所有可能結果(題目來源演算法分析設計及其案例教程第五章課後習題第五題)

這是我在csdn 的第②篇部落格 該篇為C++程式碼 原題問的是實現拓撲排序的方法,但答案給除了所有的拓撲排序的可能。 看到答案這麼寫我就在想如何才能輸出所有拓撲排序的結果?,但我一開始只能寫出輸出一種可能的拓撲排序結果的程式碼,經過一天的查詢資料後在CSDN

回溯全排列

全排列 遞迴實現:把元素換到陣列首位,剩下的部分做全排列 def constraint(): return True def bound(): return True def perm_backtracking(depth,lst): size = len

KF演算法學習(一)演算法原理推導

       學習過程中接觸到了卡爾曼濾波,因為自己的數學渣屬性,特地把自己的推導過程記錄下來以加深理解,雖然有重複造輪子的嫌疑。。        推導公式過多,圖方便自己用的office寫的文件,後來發現打算上傳到部落格上時很無能為力。。。沒辦法只能截圖上傳圖片了,文章末

全面解析HTTP/2歷史、特性、除錯、效能

寫在前面 超文字傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是網際網路上應用最為廣泛的一種網路協議。設計 HTTP 最初的目的是為了提供一種釋出和接收 HTML 頁面的方法。通過 HTTP 或者 HTTPS 協議請求的資源由統一資源識別符號(URI)來標識。

演算法47--回溯4--演算法總結

之前用回溯法解決了子集,排列,組合等問題,現在總結一下回溯演算法: 在包含問題的所有解的解空間樹中,按照深度優先搜尋的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐

回溯N皇后

N皇后: N皇后是排列樹,也是n叉樹,排列數要求:n後不在對角線上;n叉樹:n後不在對角線上且不在同一列上。 約束條件: n後不在對角線上且不在同一列上。 通過畫圖,可以輕易得到:對角線,行差距==列差距: def place(self,k):

JavaScript 常用的排序算冒泡排序快速排序

sort 一個數 最大值 ray 原理 數字 class ret 坐標 冒泡排序 function bubbleSort(array) { for (let i = 0; i < array.length; i++) for (let j =

演算法設計分析第五章 回溯 5.8流水作業車間排程

/* 流水作業車間排程: n個作業要在兩臺機器M1和M2組成的流水線上完成加工。每個作業加工的順序都是現在M1上加工,然後在 M2上加工。M1和M2加工作業i所需的時間分別為ai和bi。流水作業排程問題要求確定這n個作業的最優 加工順序,使得從第一個作業在機器M1上開始加工

演算法題(二十一)回溯解決矩陣路徑問題

題目描述 請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則之後不能再次進入這個格子。 例如 a b c e s f c s a d e

【資料結構演算法回溯解決裝載問題

回溯法解決裝載問題(約束函式優化) 解題思想 遍歷各元素,若cw+w[t]<=c(即船可以裝下),則進入左子樹,w[t]標記為1,再進行遞迴,若cw+r>bestw(即當前節點的右子樹包含最優解的可能),則進入右子樹,否則,則不遍歷右子樹。 完整程式碼實現如下 p

【資料結構演算法回溯解決N皇后問題,java程式碼實現

N皇后問題 問題描述 在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法,這稱為八皇后問題。 延伸一下,便為N皇后問題。 核心思想 解決N皇后問題有兩個關鍵點。一是如何進行放置棋子,二是如何驗證棋子是否符合

小朋友學經典演算法(14)回溯和八皇后問題

一、回溯法 回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。 二、八皇后問題 (一)問