蓝桥杯-奇怪的比赛

奇怪的比赛

    某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

    每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

    每位选手都有一个起步的分数为10分。

    某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

    如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。

    你的任务是算出所有可能情况。每个答案占一行。

   看似简单,其实10层循环写起来麻烦的一个题……

   所以这题就体现出了递归的妙处。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<stdlib.h>
 4 
 5 int score(int *a)//把复杂问题用一个个函数分解的如此简单
 6 {
 7     int i,s=10;
 8     for(i=1;i<=10;i++)
 9     {
10         if(a[i])
11         {
12             s*=2;
13         }
14         else
15         {
16             s-=i;
17         }
18     }
19     if(s==100)//最终得分是100
20         return 1;
21     else
22         return 0;
23 }
24 
25 void show(int *a)//条理清晰
26 {
27     int i;
28     for(i=1;i<=10;i++)
29     {
30         printf("%d",a[i]);
31     }
32     printf("
");
33 }
34 
35 void sovle(int *a,int n)//递归的妙用
36 {
37     if(n>10)//如果10道题回答完毕
38     {
39         if(score(a))//判断其得分是不是100
40         {
41             show(a);
42         }
43         return;//只要回答完10道题在这都要return,因为sovle函数是一个递归函数
44     }
45     a[n]=1;//第一题回答正确
46     sovle(a,n+1);//递归进入第二题
47     a[n]=0;//返回后再看第一题错误的情况
48     sovle(a,n+1);//在进行递归
49 }
50 
51 int main()
52 {
53     int a[11];
54     memset(a,0,sizeof(a));
55     sovle(a,1);//从第一题开始
56     system("pause");
57     return 0;
58 }
原文地址:https://www.cnblogs.com/youdiankun/p/3594967.html