低碳生活大獎賽(藍橋杯)

某電視臺舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:

每位選手需要回答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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章