2038 box game

描述

 lcl刚开始学习递归的时候,基础打得不好,虽然会按模板套题做,但并不怎么理得清递归是怎么运行的(>_<)。。。
  所以,又是一年递归时,又是一年纠结时,lcl把自己对递归弱弱的小理解写成了一个小游戏(噢大牛退散吧……掌握得比较好的同学可以跳过这一段直接做题~)。

  游戏的内容是这样的,我们需要来尝试堆一些集装箱,每个箱子上面都有相同个数的标签,这表示箱子里所装的物品类型和个数。
  游戏一开始,我们只有一个箱子,上面的标签上写着物品的类型以及每类物品个数的初始值,然后我们需要按照一定的规则推算出下一个箱子上面标签的内容,请注意:每个箱子所能容纳的物品类型和种类数量都相同。
  现在,按照这个规则,我们可能已经把箱子们堆得很高了(@_@),但是规则对标签的内容有所限制,如果我们推算出一个箱子的标签内容超出了限制,就不能继续放下去了,这时候,我们就继续分析现有的摆在最顶上的箱子,看它是不是有可能推算出别的符合规则的箱子,如果不行的话,就把这个箱子取下来,它已经没有价值啦~接着分析现在摆在顶部的(也就是紧接着下面的那个)箱子,以此类推,直到所有的箱子都被取下,游戏结束~

  下面,由于lcl的表达能力有限,就用一个小程序来做例子吧~^^

  ……
void aba(char ch){

    if  (ch!='!'){
        cin>>ch;
        aba();
 
    }

}

  假设我们用这个递归程序来描述游戏的规则,那么我们可以看到,在这轮游戏里,箱子上有一个标签,它描述箱子里有一个char类型的物品,这个物品的初始值是给出的,以后的值都是通过读入来完成的,规定标签的值不能为’!‘。
  现在假设给出的输入是:abc!那么我们玩游戏的过程会是这样的(我们用up来描述放上一个新箱子,用down来描述取下一个老箱子,冒号后面是标签的内容)。

1.up:a
2.up:b
3.up:c
4.down:c
5.down:b
6.down:a

  大家可以清晰的看到,从第四步开始,动作开始由up变成down了,这是因为标签值等于了!,所以不能再继续堆下去了。
  箱子的堆叠情况如下图所示。

       
         c
      b b b 
  a a a a a 
  1 2 3 4 5 6 

  或许到这里能够说明一些问题,放上一个新箱子其实对应着我们在递归过程中调用函数的过程,我们不断的调用函数自身,不断的摆上新的箱子,直到新的箱子已经违背了对此函数的限制为止。每一次的函数调用,系统都会记录下当前的所有变量值,就好像每个箱子都有确定的标签一样。   而在这里要注意,递归调用必须有一个能够让它终止的规则,否则箱子就会无止尽的越摆越高,最后这个世界就会崩溃啦~

  好吧\(^o^)/~现在我们就根据上面那个小例子,来输出一下对于任意给出的数据,玩游戏的过程会是怎样的吧~

输入

包括n组数据。
第一行:包括一个整数n (1<=n<=200)
第2~2*n+1行:
每组数据包括一行,即一个以!结尾的字符串。

输出

对于每组数据,按照“序号:up/down:标签值”的格式依次输出递归过程。两组数据间空一行
详见样例。

样例输入
2
123!
abc!
样例输出
1.up:1
2.up:2
3.up:3
4.down:3
5.down:2
6.down:1

1.up:a
2.up:b
3.up:c
4.down:c
5.down:b

6.down:a



此题没有用递归来做,用字符串来实现耗时更少

#include <stdio.h>


int main()
{
	int number,t;
	int i;
	int j;
	int k;
	char a[1000];
	scanf("%d",&number);
	for(t=1;t<=number;t++)
	{
		k=1;
		scanf("%s",&a);

		for(i=0;a[i]!='!';i++)
		{
			printf("%d.up:%c\n",k++,a[i]);
		}
		
		for(j=i-1;j>=0;j--)
		{
			printf("%d.down:%c\n",k++,a[j]);
		}
		

		printf("\n");
	}

	return 0;
}


你可能感兴趣的:(游戏,c,UP)