benTuTuT缺钱花了,就开始找他的兄弟借钱。
根据与benTuTuT关系的亲密程度,将n-1个兄弟划分为1-n-1(无重复),第n个人为benTuTuT,这个关系表里的每一个人x,都和x-1与x-2关系最好,
于是benTuTuT开始向n-1和n-2号兄弟借钱(他先向n-1号兄弟借钱,兄弟n-1回复没钱后,他再向n-2号兄弟借钱)。
虽然benTuTuT的兄弟和他平时玩得挺好的,但一说到钱,兄弟们便表面了起来,但是他们也不好直接拒绝,于是假装
自己没钱,开始向和他最亲密的两个兄弟开始借钱。
于是
当n-1号兄弟被找借钱后他会找n-2号兄弟借钱,n-2号兄弟回复没钱后,他再找n-3号兄弟借钱,如果还是没钱,他就会回复找他借钱的人"I don’t have money"。
当n-2号兄弟被找借钱后他会找n-3号兄弟借钱,n-3号兄弟回复没钱后,他再找n-4号兄弟借钱,如果还是没钱,他就会回复找他借钱的人"I don’t have money"。
…
当2号兄弟被找借钱后他会找1号兄弟借钱,如果还是没钱,他就会回复找他借钱的人"I don’t have money"。
当1号兄弟被找借钱后,由于与benTuTuT的关系较为疏远,所以他会直接回复"I don’t have money"。
PS:如果你还看不懂,请参照样例和最后的样例解释
输入描述:
第一行输入一个整数t,代表有t组测试数据,
对于每组测试数据,输入一个n代表benTuTuT一共有n-1个兄弟
1<=t<=10 2<=n<=10
输出描述:
对于每组测试数据
输出对应的说话顺序,如样例所示
并且每两组测试数据之间应该存在一行空行
示例1
输入
2
3
4
输出
Brother 1:I don’t have money
Brother 2:I don’t have money
Brother 1:I don’t have money
Brother 1:I don’t have money
Brother 2:I don’t have money
Brother 1:I don’t have money
Brother 3:I don’t have money
Brother 1:I don’t have money
Brother 2:I don’t have money
#include<stdio.h>
void lend(int n);
void put(int i);
int main()
{
int n;
scanf("%d",&n);
lend(n-1);
}
void lend(int n) //对第一好的兄弟借钱
{
if(n==1)
{
put(n);
}
else
{
lend(n-1); //对第二好的兄弟借钱的结果
put(n); //第一好的兄弟没有钱
lend(n-1); //对第二好的兄弟借钱的结果
}
}
/*对运算结果分析发现,对n个人的结果为两个n-1的结果夹一个brother n,
再发现汉诺塔的结果与该题的结果相识,可以借助汉诺塔的递归函数*/
void put(int i)
{
printf("Brother %d:I don't have money\n",i);
}
总结:
1.以正常方法难以解决一个问题时,可以观察它的答案,以数学归纳法归纳出答案的规律以解答。
2.设计一个函数时,如果过程难以解决,可以重点关注其函数作用。