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

  • 相关阅读:
    重写Override和重加载Overload
    Java 继承
    poj 3263 Tallest Cow
    矩阵求和
    全排列
    最大乘积
    三角形面积
    Sum
    搭积木
    调手表
  • 原文地址:https://www.cnblogs.com/yym2013/p/3603062.html
Copyright © 2020-2023  润新知