C语言解决球钟问题:

来源:互联网 发布:小蜜蜂抢购软件 编辑:程序博客网 时间:2024/05/17 06:04
吐舌头球钟问题描述:
球钟是一个利用球的移动来记录时间的简单装置。
它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器。
若分钟指示器中有2个球,5分钟指示器中有6个球,小时指示器中有5个球,则时间为5:32。
    
工作原理:每过一分钟球钟就会从球队列的队首取出一个球放入分钟指示器,分钟指示器最多可容纳4个球。
当放入第五个球时,按在分钟指示器的4个球就会照他们被放入时的相反顺序加入球队列的队尾。
而第五个球就会进入五分钟指示器。按此类推,五分钟指示器最多可放11个球,小时指示器最多可放11个球。
当小时指示器放入第12个球时,原来的11个球按照他们被放入时的相反顺序加入球队列的队尾,
然后第12个球也回到队尾。这时,三个指示器均为空,回到初始状态,从而形成一个循环。

因此,该秋种表示的时间范围是从00:00到11:59。


利用前面两篇文章中的栈和队列,解决该问题:

解决方法有多种,本人的方案如下:

/*************************************************************************> File Name: main.c> Author: XXDK> Email: v.manstein@qq.com > Created Time: Wed 08 Mar 2017 04:00:57 AM PST ************************************************************************/#include"linkqueue.h"#include"linkstack.h"int main(int argc, const char *argv[]){int ball;int m5ball;int m60ball;int m720ball;int time_1minu = 0;int time_5minu = 0;int time_60minu = 0;int time_12h = 0;int num_array[27] = {1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 10, 21, 22, 23, 24, 25, 26, 27};LinkQueue* ballqueue;LinkStack* stack_minu_5;// 5 minutesLinkStack* stack_minu_60;// 60 minutes = 1 hourLinkStack* stack_minu_720;// 720 minutes = 12 hoursballqueue = create_empty_linkqueue();stack_minu_5 = create_empty_linkstack();stack_minu_60 = create_empty_linkstack();stack_minu_720 = create_empty_linkstack();for(int i = 0; i < 27; i++) {enter_linkqueue(ballqueue, num_array[i]);}printf("1. create ballqueue ok.\n");while(1) {ball = delete_linkqueue(ballqueue);if(stack_minu_5->n < 4) { // 1分钟的球栈未满push_linkstack(stack_minu_5, ball);time_1minu += 1;} else {// 1分钟的球栈已满// 弹出1分钟栈中的球,放入球队列中printf("5m full\n");while(!is_empty_linkstack(stack_minu_5)) {m5ball = pop_linkstack(stack_minu_5);enter_linkqueue(ballqueue, m5ball);}// 将之前导致1分钟球栈满的球拿过来,放入5分钟的球栈// 放入之前先检查5分钟球栈是否已满if(stack_minu_60->n < 11) { // 5分钟的球栈未满time_1minu = 0;time_5minu += 5;push_linkstack(stack_minu_60, ball);}else {// 5分钟的球栈已满// 弹出5分钟栈的球, 放入球队列中printf("60m full\n");while(!is_empty_linkstack(stack_minu_60)) {m60ball = pop_linkstack(stack_minu_60);enter_linkqueue(ballqueue, m60ball);}// 将之前导致5分钟球栈满的球拿过来放入1小时球栈// 放入之前, 先检查1小时球栈是否已满if(stack_minu_720->n < 11) { // 未满time_5minu = 0;time_60minu += 60;push_linkstack(stack_minu_720, ball);}  else {printf("12h full\n");// 12小时的球栈已满,// 弹出12小时的球栈,放入球队列中while(!is_empty_linkstack(stack_minu_720)) { m720ball = pop_linkstack(stack_minu_720);enter_linkqueue(ballqueue, m720ball);}// 将之前导致1小时球栈满的球拿过来 放入球队列, 最后一颗球归还// 这种情况就是4 4 11 颗球的情况,这颗球时从最前面过来的球就是 ballenter_linkqueue(ballqueue, ball);time_12h += 12;// 判断球队列是否时1-27的有序队列int k = 1;for(int i = 1; i <= 27; i++) { ball = delete_linkqueue(ballqueue);printf("i = %d, ball = %d\n", i, ball);if(i == ball) { k++;if(k == 27) {printf("time_12h = %d\n", time_12h);printf("day = %d\n", time_12h/24); printf("ok mission accomplished.\n");goto ret;}}enter_linkqueue(ballqueue, ball);}k = 0;// }}}}ret:return 0;}


结果输出result:

。。。。。。。。。。。。。。。。。

i = 23, ball = 23
i = 24, ball = 24
i = 25, ball = 25
i = 26, ball = 26
i = 27, ball = 27
time_12h = 552
day = 23

棒棒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒


0 0
原创粉丝点击