1. 程式人生 > >7-6 列車廂排程

7-6 列車廂排程

7-6 列車廂排程 (10 分)
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?

這個題的提交結果是部分正確,但我用Java除錯的輸出和輸出樣例是一致的。

思路是用三個棧,如果棧頂元素相同就出棧(實現一次排程),Java的資料結構不是很明白,所以寫起來費勁很多,程式碼如下:

import java.util.Stack;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Stacks1=new Stack();
Stacks2=new Stack();
Stacks3=new Stack();
int xu[]=new int[30];
int k=0;
int i;
String a,b;
a=in.next();
b=in.next();
in.close();
for(i=a.length()-1;i>=0;i–){
s1.push(a.charAt(i));
}
for(i=b.length()-1;i>=0;i–){
s2.push(b.charAt(i));
}
int flag=0;
while(!s2.empty())
{
if(!s1.empty()&&s1.peek() == s2.peek())
{
s1.pop();
s2.pop();
xu[k++] = 1;//1->2
}
else if(!s3.empty()&&s3.peek()s2.peek())
{
s3.pop();
s2.pop();
xu[k++] = 3;//3->2
}
else if(s1.empty()&&!s2.empty()&&s3.peek()!=s2.peek())
{
flag = 1;
break;
}
else
{
s3.push(s1.peek());
s1.pop();
xu[k++] = 2;//1->3
}
}
if(flag

1)
System.out.println(“Are you kidding me?”);
else
{
for(i=0; i<k; i++)
{
if(xu[i] == 1)
System.out.println(“1->2”);
else if(xu[i] == 2)
System.out.println(“1->3”);
else if(xu[i] == 3)
System.out.println(“3->2”);
}
}

}

}