某電視臺舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:
每位選手需要回答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