nyoj93汉诺塔(三)

2024-02-16 11:08
文章标签 汉诺塔 nyoj93

本文主要是介绍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




/*
思路:
用三个栈表示3根针,一开始让所有的金片在第一根针上,
每一次操作,让金片从一个栈出栈,进入到另一个栈,
当from栈为空时,操作不合法,
当to栈不空,且来自from栈的金片大于to栈的金片,操作非法 
*/#include<stdio.h>
#include<stack>
#include<string.h>
#include<algorithm>
using namespace std;
int t,total,opt;
int from,to;
int main()
{stack<int>a[4];scanf("%d",&t);while(t--){//清空栈 while(!a[1].empty())a[1].pop();while(!a[2].empty())a[2].pop();while(!a[3].empty())a[3].pop();scanf("%d%d",&total,&opt);for(int i=total;i>=1;i--){a[1].push(i);}int flag=1;for(int i=0;i<opt;i++){scanf("%d%d",&from,&to);if(a[from].empty()){flag=0;break;}if(!a[to].empty()&&a[to].top()<a[from].top()){flag=0;break;}a[to].push(a[from].top());a[from].pop();} if(flag) printf("legal\n");else printf("illegal\n");}return 0;
}


这篇关于nyoj93汉诺塔(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714346

相关文章

HDU 2064 汉诺塔III(水题)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目大意: 有三根杆,求把n个圆盘从左边移到右边,最少需要移动圆盘的次数。移动规则为大盘不能放在小盘上,比原始的汉诺塔题改变的地方是,只能通过中间的杆往左右两边的杆移动。 心得: 此题心得在题外,不在题内,初看此题,尼玛吓了一跳,好像很难的样子,手贱百度了一下,只注意到俩字“水题”,赶紧

【递推】【DP】-HDU-2064-汉诺塔③

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目描述:从最左边移到最右边柱子的过程中必须经过中间柱子。 解题思路: 进ACM组时候的考试题,当时虐我的题终于被我虐回来了。。一眼看出方程,1A了。。。呵呵。。满足一下我的虚荣心,,,抚慰一下受挫的心灵吧。 AC代码: #include <iostream>using names

【递推】【DP】-HDU-1996-汉诺塔⑥

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 题目描述:问三个柱子上放N个盘子,一共可能有多少种组合?(可以有柱子不放,放的时候依然满足下面盘子比上面盘子大) 解题思路: 对于放N个盘子,ans [ N ] = 3 + 6 * f ( N ) +6 * g ( N ) 这三项依次代表这N个盘子分成一堆,两堆,三堆时有多少种可能。排列

【递推】【DP】-HDU-1995-汉诺塔⑤

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 题目描述:计算汉诺塔中某个盘子的移动次数 解题思路: 想了好久,突然顿悟! 思路如下,所谓递推,即是前者与后者存在直接联系,由前者可以直接推出后者,因此必须有一端是已知的,这题里显然最下面的盘子只被动了一次,这就是开端,然后我们考虑紧挨着的两张盘子的递推关系,发现上面盘子是紧挨着的下面盘

【递推】【DP】-HDU-1207-汉诺塔②

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 题目描述:四柱汉诺塔 解题思路: 开始想了方程 f [ n ] = 2 * f [n - 2] + 3和 f [ n ] = 2 * f [n - 3] + 7。结果都不对,很郁闷,纠结半天之后,上网查攻略去了,啊!我就差一点了,但也是差了最为关键的一步! 正确的方程应该是: f [

Python 汉诺塔递归原理

# -*- coding: utf-8 -*- # 递归的重点在于放弃,放弃理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归的终结条件def move(n, start, mid, end): # n:盘子,start起始区,mid中转区,end终点区if n == 1:print('move', start, '-->', end)else:move(n-1, start, e

迭代和递归(Python)--乘方、最大公约数、汉诺塔、斐波那契、回文字符串

1.迭代 def iterPower(base,exp):result=1.0while exp>0:result*=baseexp-=1return result 运行结果: 2.递归的乘法运算: def recurMul(a,b):if b==1:return aelse:return a+recurMul(a,b-1) 运行结果: 3.递归乘方

青蛙跳台阶与汉诺塔问题

hello,各位小伙伴们上次我们复习了C语言小tip之函数递归,这次我们来使用函数递归来完成青蛙跳台阶和汉诺塔问题! 青蛙跳台阶问题 青蛙跳台阶问题:一只青蛙跳n阶台阶,一次可以跳1阶或者两阶,问有多少种情况! 如果跳1节台阶的话,只有一种情况,如果跳2节台阶的话,有两种情况一次跳一阶,或者一次性跳两阶。如果跳3节台阶的话,可以选择一次跳一节,或者第一次跳一节,第二次跳两节或者第一次跳两节,

面试题 08.06. 汉诺塔问题(整活版)(不讲武德)

题目具体要求看面试题 08.06. 汉诺塔问题(递归法)-CSDN博客 class Solution {public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {C=A;A.clear();}};

【具体数学 Concrete Mathematics】1.1.1 汉诺塔问题

【具体数学 Concrete Mathematics】1.1.1 汉诺塔问题 汉诺塔问题的设定是:给定一个由8个圆盘 1 − 8 1-8 1−8( 1 1 1号圆盘最小, 8 8 8号圆盘最大)和三根柱子 A , B , C A,B,C A,B,C,从上向下这些圆盘大小逐渐递减(即圆盘不能放在比自身小的圆盘上)放在柱子 A A A上。 问: 最少需要多少步能够将所有圆盘都转移到柱子 C C C