蓝桥杯-打靶

打靶

小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。

这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。

不同环数得分是这样设置的:
1,2,3,5,10,20,25,50

那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?

下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。

#include <stdio.h>
#define N 8

void f(int ta[], int da[], int k, int ho, int bu, int sc)
{
int i,j;
if(ho<0 || bu<0 || sc<0) return;
if(k==N){
if(ho>0 || bu>0 || sc>0) return;
for(i=0; i<N; i++){
for(j=0; j<da[i]; j++)
printf("%d “, ta[i]);
}
printf(”\n");
return;
}

for(i=0; i<=bu; i++){
	da[k] = i;
	f(ta, da, k+1, _____________ , bu-i, sc-ta[k]*i);  //填空位置
}

da[k] = 0;

}

int main()
{
int ta[] = {1,2,3,5,10,20,25,50};
int da[N];
f(ta, da, 0, 3, 6, 96);
return 0;
}

注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。

经验技巧:
代码填空题,首先看完代码猜思路,递归算法就重点看参数变化如何,第一如何参数可以变化到终止条件,第二注意参数变化时的细节。这里时选三个分数作为基础,如果这个分数选了零个,就不会把这个分数作为基础,基础数就不会少 1 。

#include <stdio.h>
#define N 8

void f(int ta[], int da[], int k, int ho, int bu, int sc)
{//ta[i]--环数i得分,da[i]--打中环数i的子弹数,k--环数id,ho--弹孔数,bu--子弹个数,sc--得分
    int i,j;
    if(ho<0 || bu<0 || sc<0) return;
    if(k==N){
        if(ho>0 || bu>0 || sc>0) return;
        for(i=0; i<N; i++){
            for(j=0; j<da[i]; j++)
                printf("%d ", ta[i]);
        }
        printf("\n");
        return;
    }

    for(i=0; i<=bu; i++){//枚举环数k上可能打中的子弹个数,若打中个数为0,则不造成弹孔
        da[k] = i;
        f(ta, da, k+1,(i == 0) ? ho : ho - 1 , bu-i, sc-ta[k]*i);  //填空位置
    }

    da[k] = 0;
}

int main()
{
    int ta[] = {1,2,3,5,10,20,25,50};
    int da[N];
    f(ta, da, 0, 3, 6, 96);
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值