-
描述
-
在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
现在我们把三根针编号为1,2,3。
所有的金片在初始时都在1号针上,现在给你的任务是判断一系列的指令过程中,是否会出现非法的指令。
而非法指令有以下两种情况:
1、某个针上已经没有金片了,但是指令依然要求从该处移动金片到其它针上。
2、把一个大的金片移动到了小的金片上。
package STL;
import java.util.Scanner;
import java.util.Stack;
// 汉诺塔(三) Accepted 36ms 308 java 08-27 14:59:19
public class nyoj_93_汉诺塔_三 {
static int i,j,t;
static Stack<Integer> s1,s2,s3;
/**
* @param 用三个栈模拟,要注意分类讨论,注意判空,比较,输出时用标记flag
*///虽然代码比较长,但是内存,时间都还是比较小的
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int N = sc.nextInt();
while(N-->0){
s1 = new Stack<Integer>();
s2 = new Stack<Integer>();
s3 = new Stack<Integer>();
int P = sc.nextInt();
for(i=P; i>=1; i--)
s1.push(i);
int Q = sc.nextInt();
boolean flag = true;
while(Q-->0){
int a = sc.nextInt();
int b = sc.nextInt();
if(a==1){
if(s1.empty()){
flag=false;
System.out.println("illegal");
break;
}
else{
t=s1.pop();
if(b==2){
if(pan(s2,t)){
flag=false;
break;
}
s2.push(t);
}
else{
if(pan(s3,t)){
flag=false;
break;
}
s3.push(t);
}
}
}
else if(a==2){
if(s2.empty()){
flag=false;
System.out.println("illegal");
break;
}
else{
t=s2.pop();
if(b==1){
if(pan(s1,t)){
flag=false;
break;
}
s1.push(t);
}
else{
if(pan(s3,t)){
flag=false;
break;
}
s3.push(t);
}
}
}
else{
if(s3.empty()){
flag=false;
System.out.println("illegal");
break;
}
else{
t=s3.pop();
if(b==2){
if(pan(s2,t)){
flag=false;
break;
}
s2.push(t);
}
else{
if(pan(s1,t)){
flag=false;
break;
}
s1.push(t);
}
}
}
}
if(flag)System.out.println("legal");
s1.clear();
s2.clear();
s3.clear();
}
}
private static boolean pan(Stack<Integer> s, int t) {
if(!s.empty() && t > s.peek()){
System.out.println("illegal");
return true;
}
return false;
}
}