题目描述:

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

    每位选手需要回答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;
}