多軌車皮編序問題

2022-03-06 20:24:05 字數 1938 閱讀 4509

在乙個列車排程站中,k條軌道連線到k條側軌處,形成k個鐵路轉軌棧,從左到右依次編號為1,2,…,k。其中左邊軌道為車皮入口,編號為0;右邊軌道為出口,編號為k+1。當k=2 時,如下圖所示。編號為1,2,…,n的n個車皮散亂地停放在編號為0,1,2,…,k的棧軌處。排程室要安排各車皮進出棧次序,使得在出口處各車皮按照其編號次序1,2,…,n依次出站。車皮移動時只能按照從左到右的方向移動。

程式設計任務:給定車皮數n和側軌數k,以及各車皮的位置,程式設計計算最優排程方案,使得移動車皮的總次數最少。

第一行有2 個正整數n和k,表示車皮數為n和側軌數為k。接下來的k+1行中,表示編號為0,1,2,…,k 的棧軌處按照從下到上的順序停放的車皮序列。每行的第乙個數表示該棧軌處的車皮數,緊接著是車皮序列。

檔案的第一行是最少移動次數m。接下來的m行是對應於最優方案的m次移動。每次移動用形如『c x y』的3個整數來表示,其中c 表示車皮編號,x 表示起始棧軌號,y 表示目標棧軌號。如果無法排程則輸出「no solution!」。

6 2

4 4 1 5 3

2 6 2

0

9

3 0 1

5 0 2

1 0 3

3 1 2

2 1 3

3 2 3

4 0 3

5 2 3

6 1 3

\(top\)記錄每乙個棧的元素個數,\(mp\)記錄每乙個棧的各個元素,\(ansn\)和\(ans\)記錄答案個數已及答案,\(res\)記錄過程。

const int n=120,inf=999999;

int n,k,top[n],mp[n][n],ansn;

struct node

ans[n*n],res[n*n];

void read()

top[k+1]=0;

for(int i=1;i<=n;++i) mp[k+1][i]=i;

}

回溯用了兩個陣列來記錄上一步的狀態。

void copy(int (*tmpmp)[n],int mp[n][n],int *tmptop,int top[n])

\(move(x,y,t)\)表示將\(x\)棧的頂部元素移至\(y\)棧,並且是第\(t\)步的操作。

void move(int x,int y,int t)

, mp[y][top[y]+1]=mp[x][top[x]],

--top[x],++top[y];

}

\(check\)函式返回值為\(1\)時,表示所有的都移動完成,即所有的數都進入了第\(k+1\)個棧。

bool check(int &t)

ans[n*n],res[n*n];

void read()

top[k+1]=0;

for(int i=1;i<=n;++i) mp[k+1][i]=i;

}void move(int x,int y,int t)

, mp[y][top[y]+1]=mp[x][top[x]],

--top[x],++top[y];

}bool check(int &t)

}void print()

printf("%d\n",ansn);

for(int i=1;i<=ansn;++i) printf("%d %d %d\n",ans[i].c,ans[i].x,ans[i].y);

}int main()

亂碼問題 Quoted printable編碼

收到郵件客戶端開啟顯示亂碼,跟網頁源 很像,但是有很多 3d 這些,郵件頭中有content transfer encoding quoted printable這樣的 從網上找了一下,是quoted printable編碼的問題。1,簡介 它是多用途網際網路郵件擴充套件 mime 的一種實現方式。...

字典序問題

碰到過很多求關於字典序的問題,一直都是用的c 的stl庫中的函式水過的,今天終於有機會,算是對字串字典序問題的乙個總結吧。如果已知乙個字串 abc 為了更直觀,我們把建立如下對映 a 1 b 2 c 3 我們把這三個字母的所有排列都寫出來,有 序號字串 對映數字 1abc 1232 acb132 3...

字典序問題

字典序問題,給定乙個長度不超過6的小寫字母公升序字串 字串中的字元相對順序和字母表中的順序一致 迅速計算出在字典中的編碼,字典如 1 2 3 26 27 28 a b c z ab ac 總體思路為先計算出給定字串前所有的個數,然後再加一 include include 計算從i開始的長度為k的所有...