【算法分析與設計】【第三週】679. 24 Game

題目來源:https://leetcode.com/problems/24-game/

週三剛複習了DFS,這周就做點有意思的題——求24點。相信求24點是大家的童年回憶,玩法也很簡單:拿出一副完整的撲克牌,然後把花牌和10以上的牌全部清理掉,只剩下數字的牌A-9放在一起,代表1-9。分配好以後每人拿出2張牌出來,看誰先想到24點。加減乘除都可以,但是4張牌必須都用上。

這周的題目就是模擬這個遊戲過程。值得一提的是,在本題中,諸如-1-1-1-1這類表達式是非法的。可以進行括號運算,且除法是小數除法

思路:利用DFS。求24點也是DFS經典應用之一。把所有的數字放好,然後列舉所有可能的運算。
以nums[4] = {4, 1, 7, 8}爲例。
利用DFS先算一輪加法:



畫了一棵二叉樹。



求得4+1+8+7!=24,於是回頭,


接着畫這棵二叉樹。


打印所有nums[0]驗證一下:


保證除法是小數除法也很容易:先處理一下傳入的數組,把整型都轉換爲雙精度型,便於小數除法運算。


bool dfs(double* nums, int numsSize) {
	printf("%.1f ", nums[0]); 
	if(numsSize == 1) {
		if(fabs(nums[0]-24)<1e-2) return true;
		else  return false;
	}
	double a,b;
	for(int i = 0; i < numsSize; i++) {
		for(int j = i+1; j < numsSize; j++) {
			a = nums[i];
			b = nums[j];
			nums[j] = nums[numsSize-1];

			nums[i] = a+b;
			if(dfs(nums, numsSize-1)) return true;
			nums[i] = a-b;
			if(dfs(nums, numsSize-1)) return true;
			nums[i] = b-a;
			if(dfs(nums, numsSize-1)) return true;
			nums[i] = a*b;
			if(dfs(nums, numsSize-1)) return true;
			//除法分母不爲0 
			if(b != 0) nums[i] = a/b;
			if(dfs(nums, numsSize-1)) return true;
			if(a != 0) nums[i] = b/a;
			if(dfs(nums, numsSize-1)) return true;
			//回溯 
			nums[i]=a;
			nums[j]=b;
		}
	}
	return false;
}


bool judgePoint24(int* nums, int numsSize) {
	double nums2double[numsSize];  // 保證除法是小數除法 
	for(int i = 0; i < numsSize; i++) {
		nums2double[i] = *(nums+i);
	}
    	if (dfs(nums2double, numsSize)) return true; 
    	else return false;
}





參考:http://blog.csdn.net/qq_29963431/article/details/50826756








發佈了29 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章