日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7-5 列车厢调度 (25 分)

發布時間:2024/7/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-5 列车厢调度 (25 分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

7-5 列車廂調度 (25 分)

1 ====== <--移動方向/ 3 ===== \2 ====== -->移動方向

大家或許在某些數據結構教材上見到過“列車廂調度問題”(當然沒見過也不要緊)。今天,我們就來實際操作一下列車廂的調度。對照上方的ASCII字符圖,問題描述如下:

有三條平行的列車軌道(1、2、3)以及1-3和2-3兩段連接軌道。現有一列車廂停在1號軌道上,請利用兩條連接軌道以及3號軌道,將車廂按照要求的順序轉移到2號軌道。規則是:

每次轉移1節車廂;
處在1號軌道的車廂要么經過1-3連接道進入3號軌道(該操作記為"1->3"),要么經過兩條連接軌道直接進入2號軌道(該操作記為"1->2");
一旦車廂進入2號軌道,就不可以再移出該軌道;
處在3號軌道的車廂,只能經過2-3連接道進入2號軌道(該操作記為"3->2");
顯然,任何車廂不能穿過、跨越或繞過其它車廂進行移動。
對于給定的1號停車順序,如果經過調度能夠實現2號軌道要求的順序,則給出操作序列;如果不能,就反問用戶 Are(你) you(是) kidding(凱丁) me(么)?

輸入格式:
兩行由大寫字母組成的非空字符串,第一行表示停在1號軌道上的車廂從左到右的順序,第二行表示要求車廂停到2號軌道的進道順序(輸入樣例1中第二行CBA表示車廂在2號軌道的停放從左到右是ABC,因為C最先進入,所以在最右邊)。兩行字符串長度相同且不超過26(因為只有26個大寫字母),每個字母表示一節車廂。題目保證同一行內的字母不重復且兩行的字母集相同。

輸出格式:
如果能夠成功調度,給出最短的操作序列,每個操作占一行。所謂“最短”,即如果1->2可以完成的調度,就不要通過1->3和3->2來實現。如果不能調度,輸出 “Are you kidding me?”

輸入樣例1:

ABC
CBA
輸出樣例1:
1->3
1->3
1->2
3->2
3->2
輸入樣例2:
ABC
CAB
輸出樣例2:
Are you kidding me?

#include <bits/stdc++.h> using namespace std; int main() {int i=0,flag=0;stack<char>a,b;char st[100],re[100];while ((st[i]=getchar())!='\n'){i++;}st[i]='\0';for (int i=strlen(st)-1;i>=0;i--){a.push(st[i]);}i=0;while ((re[i]=getchar())!='\n'){i++;}re[i]='\0';int k=0;while (k!=strlen(re)){if (!a.empty()&&a.top()!=re[k]) //移入3暫存 {b.push(a.top());a.pop();}else if (!a.empty()&&a.top()==re[k]) //直接移入2 {a.pop();k++;}while (!b.empty()&&b.top()==re[k]) //從暫存中提取 {b.pop();k++;}if (a.empty()&&!b.empty()&&b.top()!=re[k]){break;}}if (k==strlen(re)){flag=1;}while (!a.empty()) a.pop();while (!b.empty()) b.pop();k=0;for (int i=strlen(st)-1;i>=0;i--){a.push(st[i]);} // flag=1;if (flag==0){printf("Are you kidding me?\n");return 0;}if (flag==1){while (k<strlen(re)){while (!b.empty()&&b.top()==re[k]) //從暫存中提取 {printf("3->2\n");b.pop();k++;}if (!a.empty()&&a.top()==re[k]) //直接移入2 {printf("1->2\n");a.pop();k++;}else if (!a.empty()&&a.top()!=re[k]) //移入3暫存 {printf("1->3\n");b.push(a.top());a.pop();}if (a.empty()&&!b.empty()&&b.top()!=re[k]){break;}}}return 0; }

坑點:在對比1棧(起始軌道)和re數組(目標軌道)時,遇到相同的就移到目標軌道,否則移入3棧暫存,當從1棧開始移動時,只有兩個選擇:

  • 移動到2棧,即目標棧
  • 移動到3棧,即暫存棧

當暫存棧符合re數組的要求時,一定要用while循環(任意類型循環都行,只需要控制好條件)將所有符合的字符全部pop出來,不然很可能出現遺漏問題(測試點2),例如:

ABCDEF
CDBAEF
左側為正確答案

總結

以上是生活随笔為你收集整理的7-5 列车厢调度 (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。