蓝桥杯 第三届C/C++预赛真题(4) 奇怪的比赛(递归)

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

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

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

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

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

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

答案写在“解答.txt”中,不要写在这里!

 


 

  递归

  写一个递归,每一层递归代表一道题的对错情况,用一个数组存储之前所有题的对错情况。直到n==10时,计算当前成绩在当前题目对错情况下的得分是否为100。如果是100输出这种情况。

  答案

0010110011
0111010000
1011010000

   代码 

 1 #include <iostream>
 2 using namespace std;
 3 int a[11];
 4 void f(int n,int r,int s)    //题号和答题结果(答对或答错)和当前的成绩
 5 {
 6     if(r){    //如果这道题答对
 7         if(n==10 && s*2==100){
 8             a[n]=r;
 9             for(int i=1;i<=10;i++)
10                 cout<<a[i];
11             cout<<endl;
12             return ;
13         }
14         else if(n==10 && s*2!=100)
15             return ;
16         else {
17             a[n]=r;
18             f(n+1,0,s*2);
19             f(n+1,1,s*2);
20         }
21     }
22     else{
23         if(n==10 && s-n==100){
24             a[n]=r;
25             for(int i=1;i<=10;i++)
26                 cout<<a[i];
27             cout<<endl;
28             return ;
29         }
30         else if(n==10 && s-n!=100)
31             return ;
32         else{
33             a[n]=r;
34             f(n+1,0,s-n);
35             f(n+1,1,s-n);
36         }
37     }
38 }
39 int main()
40 {
41     f(1,0,10);
42     f(1,1,10);
43     return 0;
44 }

 

Freecode : www.cnblogs.com/yym2013

posted @ 2014-03-16 10:20  Freecode#  阅读(761)  评论(0编辑  收藏  举报