• 汉诺塔(三)_栈的应用


    问题 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;
    }
     
  • 相关阅读:
    URIError: Failed to decode param '/%PUBLIC_URL%/favicon.ico'
    Shiro授权管理
    Unable to execute 'doFinal' with cipher instance
    Shiro登录认证
    Shiro权限管理框架
    如此工作
    https真的安全吗,加密登录其实不简单
    奔波中,还是否记得来时路?
    最是伤情
    奈何桥上经过的地方,看醒了多少人
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5790619.html
Copyright © 2020-2023  润新知