汉诺塔(三)_栈的应用
生活随笔
收集整理的這篇文章主要介紹了
汉诺塔(三)_栈的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題 E: 漢諾塔(三)
時間限制:?3 Sec??內存限制:?128 MB提交:?2??解決:?2
[提交][狀態][討論版]
題目描述
在印度,有這么一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的圣廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的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
解題思路:
題目本身并不難,主要是因為有三個棧,不能像數組那樣來使用這三個棧,導致代碼量較多,但邏輯很簡單。
就是每次都判斷是否符合題目的兩個條件。如果不符合把t置為true,并break;在最后面判斷t。
代碼: #include <iostream> #include <cstdio> #include <stack>using namespace std;int main() {int n;int p,q;bool t=false;int a[105],b[105];scanf("%d",&n);for(int j=0;j<n;j++){stack<int> s1,s2,s3;t=false;scanf("%d %d",&p,&q);for(int i=0;i<q;i++){scanf("%d %d",&a[i],&b[i]);}for(int i=p;i>=1;i--){s1.push(i);}for(int i=0;i<q;i++){if(a[i]==1){if(s1.empty()){t=true;break;}else{if(b[i]==2){int temp=s1.top();s1.pop();if(s2.empty()){s2.push(temp);}else{if(s2.top()<temp){t=true;break;}else{s2.push(temp);}}}if(b[i]==3){int temp=s1.top();s1.pop();if(s3.empty()){s3.push(temp);}else{if(s3.top()<temp){t=true;break;}else{s3.push(temp);}}}}}if(a[i]==2){if(s2.empty()){t=true;break;}else{if(b[i]==1){int temp=s2.top();s2.pop();if(s1.empty()){s1.push(temp);}else{if(s1.top()<temp){t=true;break;}else{s1.push(temp);}}}if(b[i]==3){int temp=s2.top();s2.pop();if(s3.empty()){s3.push(temp);}else{if(s3.top()<temp){t=true;break;}else{s3.push(temp);}}}}}if(a[i]==3){if(s1.empty()){t=true;break;}else{if(b[i]==1){int temp=s3.top();s3.pop();if(s1.empty()){s1.push(temp);}else{if(s1.top()<temp){t=true;break;}else{s1.push(temp);}}}if(b[i]==2){int temp=s3.top();s3.pop();if(s2.empty()){s2.push(temp);}else{if(s2.top()<temp){t=true;break;}else{s2.push(temp);}}}}}}if(t==true){printf("illegal\n");}else{printf("legal\n");}}return 0; }
?
?
轉載于:https://www.cnblogs.com/TWS-YIFEI/p/5790619.html
總結
以上是生活随笔為你收集整理的汉诺塔(三)_栈的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDFS文件读写流程
- 下一篇: Dubbo的使用及原理浅析.