某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如: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