• nyoj 93-汉诺塔(三) stack


    93-汉诺塔(三)


    内存限制:64MB 时间限制:3000ms 特判: No
    通过数:9 提交数:10 难度:3

    题目描述:

    在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的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

    C/C++ AC:
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <cmath>
     6 #include <stack>
     7 #include <set>
     8 #include <map>
     9 #include <queue>
    10 #include <climits>
    11 
    12 using namespace std;
    13 const int MAX = 1e6 + 10;
    14 int n, a, b;
    15 
    16 int main()
    17 {
    18     cin >>n;
    19     while (n --)
    20     {
    21         scanf("%d%d", &a, &b);
    22         stack <int> s[4];
    23         for(int i = a; i >= 1; -- i)
    24             s[1].push(i);
    25         bool flag = true; // true legal
    26         while (b --)
    27         {
    28             int mv1, mv2;
    29             scanf("%d%d", &mv1, &mv2);
    30             if (!flag) continue;
    31             if (s[mv1].empty())
    32             {
    33                 flag = false;
    34                 continue;
    35             }
    36             if (!s[mv2].empty() && s[mv1].top() > s[mv2].top())
    37             {
    38                 flag = false;
    39                 continue;
    40             }
    41             s[mv2].push(s[mv1].top());
    42             s[mv1].pop();
    43         }
    44         if (flag)
    45             printf("legal
    ");
    46         else
    47             printf("illegal
    ");
    48     }
    49 }

    思路来源

  • 相关阅读:
    如何使用Flannel搭建跨主机互联的容器网络
    移动端——touch事件
    Javascript 模块化指北
    vue重构--H5--canvas实现粒子时钟
    redux-saga框架使用详解及Demo教程
    前端代码编写规范
    探秘JS的异步单线程
    POJ 3714 Raid 近期对点题解
    EditText把回车键变成搜索
    Swift语言概览
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9320466.html
Copyright © 2020-2023  润新知