低碳生活大奖赛(蓝桥杯)

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

每位选手需要回答10个问题(其编号为110),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

每位选手都有一个起步的分数为10分。

某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有10的串来表示。例如:0010110011 就是可能的情况。

你的任务是算出所有可能情况。每个答案占一行。

解析:这个题可以用DFS来做,先创建一个int类型的数组(c[10]),先让该数组10个位置都初始为-1,然后用DFS进行搜索。

代码如下:

public class 低碳生活大奖赛
{
	//dfs搜索,sum代表初始分数,i代表当前下标,T没有特殊意义,只是假定当前题目的对错
	public static void dfs(int[] c,int sum,int i,int T)  
	{
		if(i==10&&sum==100)    //dfs退出条件:题号为10,分数为100
		{
			for(int j=0,t=c.length;j<t;++j)
			{
				System.out.print(c[j]);
			}
			System.out.print("\n");
			return;
		}
		if(i<10)   //数组下表为0~9
		{
			dfs(c,sum*2,i+1,c[i]=1);  //该题对的情况,sum*2,c[i]=1表示该题正确
			dfs(c,sum-i-1,i+1,c[i]=0); //该题错的情况,sum-i-1,c[i]=1表示该题错误
		}
	}
	
	public static void main(String[] args)
	{
		int[] c = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//先让c数组默认为-1,后续0代表错,1代表对
		dfs(c,10,0,-1);      //dfs搜索,10代表初始分数,0代表数组起始位置,-1为默认的对错
	}
}

运行结果:

1011010000
0111010000
0010110011

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值