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;
}