列表

详情


HJ67. 24点游戏算法

描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

输入描述

读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。

输出描述

对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false

示例1

输入:

7 2 1 10

输出:

true

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 328KB, 提交时间: 2021-09-12

#include <stdio.h>
#include <stdbool.h>

int flag = 0;

bool is24cal(double sum,double* pnum,int size)
{
    double cnn[4] = {0};
    if(flag == 1)
        return true;
    if(size == 3)
    {
        if(sum == 24)
        {
            flag = 1;
        }
        return true;
    }
    size++;
    for(int i =0;i<=4-size;i++)
    {
        for(int j= 0;j<=4-size;j++)
        {
            if(i != j)
            {
                int count = 1;
                for(int z= 0 ;z<=4-size;z++)
                {
                    if(z!=i && z != j)
                    {
                        cnn[count++] = pnum[z];
                    }
                }
                cnn[0] = pnum[i] + pnum[j];
                is24cal(cnn[0],cnn,size);
                cnn[0] = pnum[i] - pnum[j];
                is24cal(cnn[0],cnn,size);
                cnn[0] = pnum[i] * pnum[j];
                is24cal(cnn[0],cnn,size);
                cnn[0] = pnum[i] / pnum[j];
                is24cal(cnn[0],cnn,size);                
            }
        }
    }
    return true;
}

int main()
{
    double num[5];
    while(scanf("%lf %lf %lf %lf",&num[0],&num[1],&num[2],&num[3]) != EOF)
    {
        is24cal(0,num,0);
        if(flag == 1)
        {
            printf("true\n");
        }
        else
        {
            printf("false\n");
        }
        flag = 0;
    }
    return  0;
}

C 解法, 执行用时: 1ms, 内存消耗: 340KB, 提交时间: 2020-11-13

#include <stdio.h>
#include <string.h>

int inp[4]={0};
int flag[4]={0};

int dfs(int num)
{
    if(num==24)
        return 1;
    for(int i=0;i<4;i++)
    {
        if(flag[i]==0)
        {
            flag[i]=1;
            if(dfs(num+inp[i]))
                return 1;
            else if(dfs(num-inp[i]))
                return 1;
            else if(dfs(num*inp[i]))
                return 1;
            else if(dfs(num/inp[i]) && (num%inp[i]==0))
                return 1;
            flag[i]=0;
        }
    }
    return 0;
}

int main()
{
    while(scanf("%d %d %d %d",&inp[0],&inp[1],&inp[2],&inp[3])!=EOF)
    {
        memset(flag,0,sizeof(flag));
        if(dfs(0))
            printf("true\n");
        else
            printf("false\n");
    }
    return 0;
}

上一题