每日刷题(三十五)
蓝桥杯第七届C语言B组省赛习题
习题E:抽签
这个题一看就是要递归,因为这里有个递归出口
他说数组a[]是每个国家可以派出的最多名额,那么看题目所给代码,int a[N] = {4, 2, 2, 1, 3}和题意对应,可以知道数组里从第0个元素到第4个元素分别为A国到E国所能派出的最大人数。
b[M] = 0就是结束标志符,因为k刚开始为0,而递归的终止条件是k == N,说明k要不断增加,根据if(m==0)可知m要不断减少
这里是测试代码,增添了num变量,验证是否为101个方案
#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024
int num = 0;
void f(int a[], int k, int m, char b[])
{
int i,j;
if(k==N){
b[M] = 0;
if(m==0)
{
printf("%s\n",b);
num++;
}
return;
}
for(i=0; i<=a[k]; i++){
for(j=0; j<i; j++)
b[M-m+j] = k+'A';
f(a, k + 1, m - j, b); //填空位置
}
}
int main()
{
int a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
printf("%d\n", num);
return 0;
}
部分运行结果如下: