C语言程序设计——奇怪的比赛

本文通过一个低碳生活大奖赛的奇怪计分规则来阐述递归算法的应用。参赛者需回答10个问题,答对翻倍得分,答错扣相应分数。获胜者得分为100分,通过递归算法,推断所有可能的答题情况。通过代码实现和调试,理解递归的过程,并提供了一个使用递归的解决方案。
摘要由CSDN通过智能技术生成

设计题目——奇怪的比赛

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条件嵌套。我这里就不写了,大家可以试一试!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值