蓝桥杯 第三届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

你可能感兴趣的:(c/c++)