球钟问题

球钟问题描述:

球钟是一个利用球的移动来记录时间的简单装置。它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器。若分钟指示器中有2个球,5分钟指示器中有6个球,小时指示器中有5个球,则时间为5:32。

工作原理:

每过一分钟,球钟就会从球队列的队首取出一个球放入分钟指示器,分钟指示器最多可容纳4个球。当放入第五个球时,在分钟指示器的4个球就会按照他们被放入时的相反顺序加入球队列的队尾。而第五个球就会进入分钟指示器。按此类推,五分钟指示器最多可放11个球,小时指示器最多可放11个球。当小时指示器放入第12个球时,原来的11个球按照他们被放入时的相反顺序加入球队列的队尾,然后第12个球也回到队尾。这时,三个指示器均为空,回到初始状态,从而形成一个循环。因此,该秋种表示的时间范围是从00:00到11:59

要想表示00:00到12:00需要多少个球?

 球钟问题_第1张图片

请问:球队列里球经过多长时间恢复初始状态?

队列用的自己写的队列,栈是系统自带的栈

package com.java.qiuzhong;
public class LinkQueue{
	public Node head;
	public Node front;
	public Node rear;
	private int size;
	public LinkQueue() {
		head=new Node(null);
		front=head;
		rear=head;
	}

	public void inQueue(t data){
		Node node=new Node(data);
		node.next=rear.next;
		rear.next=node;
		rear=node;
		size++;
	}
	
	public t outQueue(){
		if(front.next==null){
			throw new RuntimeException("队列为空,无法出队列");
		}
		Node oldNode=front.next;
		front.next=front.next.next;
		oldNode.next=null;
		size--;
		if(size==0){
			rear=head;
		}
		return oldNode.data;
	}
	
	public int size(){
		return size;
	}
}

package com.java.qiuzhong;

public class Node{
	public t data;
	public Node next;
	public Node(t data) {
		this.data=data;
	}
	public Node(Node next) {
		this.next=next;
	}
}

package com.java.qiuzhong;

public class Ball {
	public int data;
	public Ball(int data){
		this.data=data;
	}
}

 
  



package com.java.qiuzhong;

import java.awt.HeadlessException;
import java.util.LinkedList;
import java.util.Stack;

public class Test {

	public static void main(String[] args) {
		int count=0;
		Ball temp=null;
		LinkQueue queue=new LinkQueue();
		Stack minute_Stack=new Stack();
		Stack fiveminute_Stack=new Stack();
		Stack hour_Stack=new Stack<>();
		for(int i=1;i<=27;i++){
			queue.inQueue(new Ball(i));
		}			
		do{
			while(hour_Stack.size()<=11){
				
				while(fiveminute_Stack.size()<=11){
					
					while(minute_Stack.size()<=4){	
						temp=queue.outQueue();//出队列
						if(minute_Stack.size()==4){			//分钟栈长度等于4,到下层循环			
							break;
							}else	minute_Stack.push(temp);//小于4入栈
					}	
					minute_StackToQueue(queue, minute_Stack);//将分钟栈的球出队列
						if(fiveminute_Stack.size()==11){
							break;
						}else fiveminute_Stack.push(temp);
				}
				
				fiveminute_StackToQueue(queue, fiveminute_Stack);
			
				if(hour_Stack.size()==11){
					break;	
				}else 	hour_Stack.push(temp);
			}
			hour_StackToQueue(queue, hour_Stack);
			queue.inQueue(temp);
			count++;
		}while(!regress(queue));
		
		System.out.println("需要"+count*12/24+"天");	
	}
	
	public static void minute_StackToQueue(LinkQueue queue,Stack minute_Stack){
		for(int i=0;i<4;i++){
			queue.inQueue(minute_Stack.pop());
		}
	}
	
	public static void fiveminute_StackToQueue(LinkQueue queue,Stack fiveminute_Stack){
		for(int i=0;i<11;i++){
			queue.inQueue(fiveminute_Stack.pop());
		}
	}
	
	public static  void hour_StackToQueue(LinkQueue queue,Stack hour_Stack){
		for(int i=0;i<11;i++){
			queue.inQueue(hour_Stack.pop());
		}
	}
	
	public static boolean regress(LinkQueue queue){
		Nodecurnode=queue.front.next;
		for(int i=1;i<=27;i++){
			if(curnode.data.data!=i){
				return false;
			}
			curnode=curnode.next;
		}
		return true;
	}
}

结果:需要23天

你可能感兴趣的:(数据结构)