漢諾塔(三)
阿新 • • 發佈:2017-08-02
++ 但是 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;//棧頂
//++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;
}
漢諾塔(三)