火車排程問題的回溯法解決

2021-06-18 13:05:22 字數 1453 閱讀 8234

問題描述:

火車編號為:1~9,且不重複。

如:編號分別為「1」、「2」、「3」、「4」、「5」的5個火車順序進站,那麼進站序列為「12345」,全部進站後再順序出站,則出站序列為「54321」,如果先進1,2,然後2出站,然後1出站,然後再3進站、出站,4進站、出站,5進站、出站,那麼出站序列就為21345.

詳細描述:   

int judgetrainsequence (int maxnum, char *poutseq);

輸入引數:

int maxnum:進站的火車最大編號

char* poutseq:使用字串表示火車出站序列

輸出引數(指標指向的記憶體區域保證有效):

無。返回值:

int: 根據輸入的進站序列判斷,如果輸入的出站序列是可能的,返回1,否則返回0;

基本思路:

stack陣列用來表示火車進站的棧,queue用來表示12345.。。n的要進站的火車佇列(左邊是棧和佇列的雙重性質),cand是出站的火車,是棧的結構。

backtrace(int *stack,int* pstack,int* queue,int* pqueue,int *cand,int* pcand,int candnum)

void printpath()

bool isstackempty()

bool isqueueempty()

/******3選二的對稱操作******************/

void rollbackqueue(int )

int popstack()

void encand(int )

/***********************/

/******** 3選二的對稱操作**********************/

int rollbackcand()

void pushstack(int)

int outqueue()

/****************************/

backtrace(int *stack,int* pstack,int* queue,int* pqueue,int *cand,int* pcand,int candnum)

// sibling1   // 如果棧非空,火車出站

if(!isstackempty())

else;//棧空了,什麼都不做。

//sibling2:如果佇列非空,則火車入站

if(!isqueueempty())

else; // 佇列空了,說明沒有可用元素,只能彈棧了

}void init(n)// 設有n輛車入棧

演算法 回溯法解決最佳排程問題

問題 假設有 n 個任務由 k 個可並行工作的機器來完成。完成任務 i 需要時間為ti 設計完成這 n 個任務的最佳排程演算法,使得完成全部任務的時間最早。演算法設計 從n個作業中找出有最小完成時間和的作業排程,所以批處理作業排程問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時t...

演算法 回溯法解決最佳排程問題

問題 假設有 n 個任務由 k 個可並行工作的機器來完成。完成任務 i 需要時間為ti 設計完成這 n 個任務的最佳排程演算法,使得完成全部任務的時間最早。演算法設計 從n個作業中找出有最小完成時間和的作業排程,所以批處理作業排程問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時t...

回溯法 最佳排程問題

一 題目要求 設有n個任務由k個可並行工作的機器來完成,完成任務i需要時間為。試設計乙個演算法找出完成這n個任務的最佳排程,使完成全部任務的時間最早。二 演算法設計與分析 該演算法可抽象為子集樹回溯演算法,針對特定的任務數和機器數定 空間,對於n個任務和k個機器,解編碼 x1,x2,xn xi表示給...