题目描述:
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
答案写在“解答.txt”中,不要写在这里!
思路:我觉得这一题适合用深入搜索递归来做,每一题只有两种情况,对与错,对了,当前成绩就翻倍,错了,当前成绩就减去此题的题号,然后接着向下一个题进行递归(继续两种情况并且继续递归,直到到第10题回答完结束)。判定结束条件是,答完第10题后,成绩刚好为100分的时候,输出10题的对错情况然后结束本次递归,成绩不为100分直接结束本次递归。
那么,怎么输出题目的对错呢,我用的是一个结构体,有一个判定元素flag来判定此题是否对。(后来想想直接用数组存0和1也是可以的,不过结构体在其他类型的判定上也是很有用的)。
正确答案:
1011010000
0111010000
0010110011
AC代码:
#include<stdio.h> #include<stdlib.h> struct node { int flag; }a[20]; void Test(int n,int m) { int i,j; if(n==10) { if(m==100) { for(i=1;i<=10;i++) printf("%d",a[i].flag); puts(""); return; } else return; } i=n+1; m*=2;a[i].flag=1; Test(i,m); m/=2; m-=i;a[i].flag=0; Test(i,m); m+=i; } int main() { int i,j,n,m=10; Test(0,10); system("pause"); return 0; }