編程每日刷題系列九(抽簽)
抽簽
X星球要派出一個5人組成的觀察團(tuán)前往W星。
其中:
A國最多可以派出4人。
B國最多可以派出2人。
C國最多可以派出2人。
....
那么最終派往W星的觀察團(tuán)會有多少種國別的不同組合呢?
下面的程序解決了這個問題。
數(shù)組a[] 中既是每個國家可以派出的最多的名額。
程序執(zhí)行結(jié)果為:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,總共101行)
#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024
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);
return;
}
for(i=0; i<=a[k]; i++){
for(j=0; j<i; j++) b[M-m+j] = k+'A';
______________________;? //填空位置
}
}
int main()
{
int? a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
return 0;
}
仔細(xì)閱讀代碼,填寫劃線部分缺少的內(nèi)容。
注意:不要填寫任何已有內(nèi)容或說明性文字。
思路
這題一看就知道填空的部分是遞歸,所以我們直接考慮哪些變量需要變動,這里有個框架f(a,x,x,b);第一層循環(huán)我們知道i表示k國派出的人數(shù),j表示填入b的人數(shù),看遞歸出口,
if(k==N){?
b[M] = 0;
if(m==0) printf("%s\n",b);
return;
}
而一開始k = 0,說明期間k在遞增,說明框架是f(a, k + 1,? x, b),由推理可知,第三空肯定是缺少的人數(shù),即用m -?i,所以答案是:
f(a,k + 1,m -?i,?b)
為了驗(yàn)證此答案,特地在原代碼上改動了一下
運(yùn)行結(jié)果:

總數(shù)也是101,符合題意
如果喜歡我的文章,之后我會持續(xù)更新,請記得一鍵三連哦,點(diǎn)贊關(guān)注收藏,你的每一個贊每一份關(guān)注每一次收藏都將是我前進(jìn)路上的無限動力 ?。?!↖(▔▽▔)↗感謝支持!