某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答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