在乙個列車排程站中,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的所有...