LeetCode解题方法14 24点-追溯+分数表示小数

1.题目
679. 24 点游戏

2.思路、
用分数表示小数
遍历所有运算方式
3.679题
题目:
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

示例 1:

输入: [4, 1, 8, 7]
输出: True
解释: (8-4) * (7-1) = 24
示例 2:

输入: [1, 2, 1, 2]
输出: False
注意:

除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。
每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。
你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/24-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码

#define INNUM 4
#define CHARMAX 256

typedef struct STR {
	int fenzi;
	int fenmu;
} num;

void initlist(char* list)
{
	char i;
	for (i = '2'; i <= '9'; i++) {
		list[i] = i - '0';
	}
	list['A'] = 1;
	list['T'] = 10;
	list['J'] = 11;
	list['Q'] = 12;
	list['K'] = 13;
}

int IsTarget(num a, num target)
{
	int temp1, temp2;
	temp1 = a.fenmu * target.fenzi;
	temp2 = a.fenzi * target.fenmu;

	if (temp1 == temp2) {
		return 0;
	} else {
		return -1;
	}
}

num Plus(num a, num b)
{
	num c;
	c.fenzi = a.fenmu * b.fenzi + a.fenzi * b.fenmu;
	c.fenmu = a.fenmu * b.fenmu;
	return c;
}

num De(num a, num b)
{
    int temp1, temp2;
	num c;
	c.fenzi = a.fenzi * b.fenmu - a.fenmu * b.fenzi;
	c.fenmu = a.fenmu * b.fenmu;
	return c;
}

num Cheng(num a, num b)
{
    int temp1, temp2;
	num c;
	c.fenzi = a.fenzi * b.fenzi;
	c.fenmu = a.fenmu * b.fenmu;
	return c;
}

num Chu(num a, num b)
{
    int temp1, temp2;
	num c;
	c.fenzi = a.fenzi * b.fenmu;
	c.fenmu = a.fenmu * b.fenzi;
	return c;
}

void Change(num a[], int i, int j)
{
	num t;
	t = a[i];
	a[i] = a[j];
	a[j] = t;
}

void Search(num a[], int pos, num target, bool* flag)
{
	int i, j;
	num t;
	if(a[pos].fenmu == 0) {
		return;
	}
	if ((IsTarget(a[INNUM - 1], target) == 0) && (pos == INNUM - 1)) {
		*flag = true;
		return;
	}
	if (pos == INNUM - 1) {
		return;
	}

	for ( i = pos; i < INNUM - 1; i++) {
		for (j = pos + 1; j < INNUM; j++) {
			Change(a, i, pos);
			Change(a, j, pos+1);
			t = a[pos + 1];
			a[pos + 1] = Plus(t, a[pos]);
			Search(a, pos+1, target, flag);
			
			a[pos + 1] = De(t, a[pos]);
			Search(a, pos+1, target, flag);
			
			a[pos + 1] = De(a[pos], t);
			Search(a, pos+1, target, flag);
			
			a[pos + 1] = Cheng(t, a[pos]);
			Search(a, pos+1, target, flag);

			a[pos + 1] = Chu(a[pos], t);

			Search(a, pos+1, target, flag);

			a[pos + 1] = Chu(t, a[pos]);
			Search(a, pos+1, target, flag);
			
			a[pos + 1] = t;			
			Change(a, j, pos+1);
			Change(a, i, pos);
		}
	}
	return;
}

bool judgePoint24(int* nums, int numsSize){
    int i;
    num a[INNUM];
    num target = {24, 1};
    bool flag = false;//0代表结果没有24的 
    //char list[CHARMAX];
	//initlist(list);
    for (i = 0; i < numsSize; i++) {
		a[i].fenmu = 1;
		//a[i].fenzi = (int)list[nums[i]];
        a[i].fenzi = nums[i];
	}
	Search(a, 0, target, &flag);
    return flag;
}

你可能感兴趣的:(LeetCode解题方法14 24点-追溯+分数表示小数)