1. 程式人生 > >漢諾塔(三)

漢諾塔(三)

++ 但是 logs 大片 scanf pan 兩種 初始 入棧

漢諾塔(三)

描述

在印度,有這麽一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裏,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

現在我們把三根針編號為1,2,3。

所有的金片在初始時都在1號針上,現在給你的任務是判斷一系列的指令過程中,是否會出現非法的指令。

而非法指令有以下兩種情況:

1、某個針上已經沒有金片了,但是指令依然要求從該處移動金片到其它針上。

2、把一個大的金片移動到了小的金片上。

輸入
第一行輸入一個整數N表示測試數據的組數(N<10)
每組測試數據的第一行有兩個整數P,Q(1<P<64,1<Q<100),分別表示漢諾塔的層數與隨後指令的條數
隨後的Q行,每行都輸入兩個整數a,b,(1<=a,b<=3)表示一條指令。
指令1 2表示把1號針最上面的金片移動到2號針最上面。
數據保證a,b不會相同。
輸出
如果存在非法指令,請輸出illegal
不存在非法指令則輸出legal
樣例輸入
3
2 1
1 2
3 3
1 2
1 3
3 2
2 1
2 1
樣例輸出
legal
illegal
illegal


思路:數組與棧的靈活結合與運用
1.定義stack[3][65]數組,行表示棧,列表示金片;
2.定義每一個棧的棧頂指針:top[0],top[1],top[2]。一直指向棧的棧頂;
3.移動的時候,如果另外一個棧為空,或者另一個棧的元素大於要移過去的元素,則將元素移過去;
代碼:
#include<stdio.h>
  int main()
{
    int i,n,tier,item,a,b,flag;
    int stack[3][65],top[3];
    top[0] = top[1] = top[2] = -1;//棧頂
scanf("%d",&n); while(n--) { flag = 1; scanf("%d%d",&tier,&item);//層數和指令數 for(i=0;i<tier;i++) { stack[0][i] = tier - i;//入棧 top[0]++;//棧頂移動,所以top[0]永遠是指向棧頂的 } for(i=0;i<item;i++) { scanf("%d%d",&a,&b); if(top[a-1] != -1)//判斷是否為空 { if(top[b-1]==-1 || (stack[b-1][top[b-1]] > stack[a-1][top[a-1]]))//符合題意的倆條件 {
//
++top[b-1]是先++再用,top[]++是先用再++
stack[b-1][++top[b-1]] = stack[a-1][top[a-1]];//入棧
printf("%d\n",stack[a-1][top[a-1]]); }

else {
flag
= 0;//標記有非法
}
top[a
-1]--;//棧頂減一

}
else flag = 0;
}

if(flag)
printf(
"legal\n");

else printf("illegal\n");
}

return 0;
}

 

漢諾塔(三)