设计题目——奇怪的比赛
1 . 题目背景
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,
当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按
错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他
(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和
0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
2 . 题目含义
题目中给出了游戏规则,也就是给出了解题方法。
算法就是: 答对 当前分数翻倍,答错 扣掉题号分数 并且必须回答10个题
已知有位选手获得了100分,让我去猜测 10道题的对错分布
3 . 解决办法
首先明白一点,上一题的对错不影响下一题的对错,所以就是两点分布(01分布)。
假设这个题是正确的。计算出这时的分数,然后猜测下一个题的对错,若对,分数二倍,若错,扣掉当前题号分数。
不断重复上述这个思路,不难想到,我要用递归算法。将重复的步骤归结起来。让计算机去执行这个庞大的猜测过程。每一次猜测的结果,保存在数组中,方便后续输出。
每答一个题,我们就把此时的分数和题号 返回给递归函数,让计算机再次猜测。
在答够10个题后,我们就去判断一下此时的分数有没有100分。如果有就输出此时的对错分布。如果没有就重新赋值sum = 10 和重新开始猜测。
4. 流程图
5. 代码实现
#include<stdio.h>
//using namespace std; 命名规范
int ans[12];
//进行深度搜索,sum代表当前分数,u代表当前答案编号
void dfs(int sum,int u){
//递归出口,当该回答11题的时候(即已经答完10题)
if(u==11){
if(sum==100){
for(int i=1 ;i<11 ;i++){
printf("%d",ans[i]);
}
printf("\n");
}
}
else{
//答错情况
ans[u]=0;
dfs(sum-u,u+1);
//答对情况
ans[u]=1;
dfs(sum*2,u+1);
}
}
int main(){
//初始分数10 从1题开始
dfs(10,1);
return 0;
}
6 . 运行结果
7 . 心得体会
这个程序重点在如何让计算机去猜测10个题的对错。我使用了递归嵌套函数。刚开始是不太理解运行过程的。后来通过查资料,找Dev C++的调试方法。理解了递归的具体过程。在其中我学会了,断点调试程序,通过设置断点 理解程序运行到哪一步。
番外
这里的递归并不好理解,大家可以通过断点调试,去仔细体会一下程序的运行过程。
另外一个比较简单的办法就是 用10个if条件嵌套。我这里就不写了,大家可以试一试!