NYOJ93 汉诺塔(三)【栈】

汉诺塔(三)

时间限制:3000 ms  |  内存限制:65535 KB

难度: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

来源

[张云聪]原创

上传者

张云聪

题目大意:上边说的很明白了。

思路:就是用三个栈进行模拟过程并判断就可以。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;

stack<int> a[4];

int main()
{

    int N,P,Q,flag;
    cin >> N;
    while(N--)
    {
        flag = 1;
        cin >> P >> Q;
        for(int i = P; i >= 1; i--)
            a[1].push(i);
        while(Q--)
        {
            int x,y;
            cin >> x >> y;
            if(a[x].empty())
            {
                flag = 0;
                continue;
            }
            else if(a[y].empty())
            {
                a[y].push(a[x].top());
                a[x].pop();
            }
            else if(a[x].top() > a[y].top())
            {
                flag = 0;
                continue;
            }
            else
            {
                a[y].push(a[x].top());
                a[x].pop();
            }
        }
        if(flag)
            cout << "legal" << endl;
        else
            cout << "illegal" << endl;
        while(!a[1].empty())
            a[1].pop();
        while(!a[2].empty())
            a[2].pop();
        while(!a[3].empty())
            a[3].pop();
    }
    return 0;
}
时间: 2024-10-05 06:13:06

NYOJ93 汉诺塔(三)【栈】的相关文章

NYOJ-93汉诺塔(三)

汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而

数据结构--汉诺塔--借助栈实现非递归---Java

1 /*汉诺塔非递归实现--利用栈 2 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 3 * 2.先进栈,在利用循环判断是否栈空, 4 * 3.非空情况下,出栈,检查是否只有一个盘子--直接移动,否则就模拟前面递归的情况--非1的情况 5 * 4.直到栈空就结束循环,就完成全部的移动. 6 * */ 7 class Stack11{ 8 Towers[] tt = new Towers[20]; 9 int top = -1; 10 11 public boolean i

汉诺塔(Tower of Hanoi)问题的求解——利用栈与递归

汉诺塔(Tower of Hanoi)问题的求解--利用栈与递归 1. 汉诺塔问题的提法 汉诺塔问题是使用递归解决问题的经典范例. 传说婆罗门庙里有一个塔台,台上有3根标号为A.B.C的用钻石做成的柱子,在A柱上放着64个金盘,每一个都比下面的略小一点.把A柱上的金盘全部移到C柱上的那一天就是世界末日. 移动的条件是:一次只能移动一个金盘,移动过程中大金盘不能放在小金盘上面.庙里的僧人一直在移个不停,移动的最少总次数是264?1次,如果每秒移动一次的话,需要500亿年. 2. 求解汉诺塔问题的算

多柱汉诺塔最优算法

转自Florian 1. 三柱汉诺塔三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题.其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上[T(n-1)步],然后把A 柱剩下的一个碟子移到C 柱上[1步], 最后把B 柱上所有的碟子通过A 柱移到C 柱上[T(n-1)步].很容易得到算法的递归方程为:T(n)=2*T(n-1)+1,因此,不难算出步数是T(n)=2^n-1.对于三柱汉诺塔的算法的正确性自然是毫无争议的,我们需要的是从三柱汉诺塔的设计中引申出多柱

NYOJ 93 汉诺塔(三) 【栈的简单应用】

汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候.在当中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔. 不论白天黑夜,总有一个僧侣在依照以下的法则移动这些金片:一次仅仅移动一片.无论在哪根针上.小片必须在大片上面.僧侣们预言.当全部的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中

汉诺塔(三)_栈的应用

问题 E: 汉诺塔(三) 时间限制: 3 Sec  内存限制: 128 MB提交: 2  解决: 2[提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移

汉诺塔(三)

汉诺塔(三) 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 现在我们把三根针编号为1,2,3. 所

Hanoi(汉诺塔问题)用栈来求解

学习c语言必定会遇到递归问题,学递归一定知道汉诺塔问题:如何将圆盘移动到另一根柱子上,但是圆盘的顺序不能改变. 有XYZ三个轴,n个盘子放在X轴上,目标是将N个盘子从X轴上移动到Z轴上 这里我们假设有这样一个方法F,F:将N个盘子按照原来的顺序从X轴上移动到Z轴上 如果只有一个盘子的话,一步到位 但是有N个(N>1)是,为了实现目标,我们需要利用中间轴来倒腾,我们将最后一个盘子上方的N-1个盘子按照顺序不变的方式(方法F)(这并不是移动步数最少的办法)先移动到Y轴,在将最后一个剩余的盘子移动到Z

汉诺塔(三)(水,模拟)

汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而