1. 程式人生 > >資料結構-7-2 列車廂排程

資料結構-7-2 列車廂排程

7-2 列車廂排程 (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?

使用模擬棧,只能用c寫,很硬核。

#include<stdio.h>
#include<string.h>
char str1[29],str2[29];  //存放字元 
int index1,index2,inout=0;   //out陣列下標  
int stack[30],top=0,out[50];   //存放要輸出的操作 12代表1->2  13代表1->3  32代表3->2 
int main()
{
	int flag=1;
	scanf("%s %s",str1,str2);  
	int len = strlen(str1); 
	while(1)
	{
		if(index1<len&&str1[index1]==str2[index2])//如果12道對應元素位置相同 
		{ 
			index1++;
			index2++; 
			out[inout++]=12;
		}
		else if(top!=0&&stack[top-1]==str2[index2])//和棧內元素相同時 
		{
			top--;
			index2++; 
			out[inout++]=32;
		}
		else//如果不符合上面兩種情況 
		{
			if(index2==len)//如果滿了跳出 
				break;
			stack[top++]=str1[index1++];
			out[inout++]=13;
			if(index1>=len) 
			{ 
				flag=0;
				break;
			}
		} 
	}
	if(!flag||top)
		printf("Are you kidding me?\n");
	else
		for(int i=0;i<inout;i++)
		{ 
			if(out[i]==12)
			  printf("1->2\n");
			else if(out[i]==13)
			  printf("1->3\n");
			else if(out[i]==32)
			  printf("3->2\n");
		} 
	}