zoukankan      html  css  js  c++  java
  • 汉诺塔(三)_栈的应用

    问题 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
    ");
            }else{
                printf("legal
    ");
            }
        }
        return 0;
    }
     
  • 相关阅读:
    mybatis sql in 查询
    js中同一个onclick绑定了两个js方法出现的问题
    异步ztree 加复选框 及相应后台处理
    让delphi程序不受WINDOWS日期格式的影响
    Delphi调用java开发的WebService,传入参数出错
    在Delphi中实现HexToStr函数和StrToHex函数
    最快的安卓模拟器Genymotion
    详解Android中AsyncTask的使用
    JNI之——&#39;cl&#39; 不是内部或外部命令,也不是可执行的程序或批处理文件
    CorePlot学习六---点击scatterPlot中的symbol点时弹出对应的凝视
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5790619.html
Copyright © 2011-2022 走看看