漢諾塔(三)

漢諾塔(三)

描述

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

 

如今咱們把三根針編號爲1,2,3。測試

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

而非法指令有如下兩種狀況:指針

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

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

輸入
第一行輸入一個整數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;}
相關文章
相關標籤/搜索