【洛谷P1236】算24点【搜索】

博客围绕一道题目展开,题目要求给出四个整数,判断能否经一系列运算使它们最终组成24,且运算任意时刻数字须为整数。解题思路是采用搜索算法,枚举使用的两个数字及运算方法,将用过数字改为 -1,最后判断有无数字变为24。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P1236
给出四个整数,求能否经过一系列运算使得这四个数字最终组成24。
注意:运算的任意时刻数字均必须为整数。


思路:

很显然的搜索嘛。
可以考虑每次枚举使用那两个数字进行运算,然后再枚举使用哪一种运算方法(加减乘除)。把用过的数字修改成-1.最终搜索完之后判断有没有一个数字变成了24即可。
思路还是比较简单,注意细节即可。
时间复杂度: O ( O( O(懒得算但是可以过 ) ) )


代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int a[5],ans[4][4];
bool ok;

void print()  //输出
{
    for (int i=1;i<=3;i++)
    {
    	if (ans[i][1]<ans[i][3])
			swap(ans[i][1],ans[i][3]);  //注意题目中说两个数必须先输出大的再输出小的
        printf("%d",ans[i][1]);  //输出第一个数字
        if (ans[i][2]==1) printf("+");
        if (ans[i][2]==2) printf("-");
        if (ans[i][2]==3) printf("*");
        if (ans[i][2]==4) printf("/");  //输出运算符号
        printf("%d",ans[i][3]);
        if (ans[i][2]==1) printf("=%d\n",ans[i][1]+ans[i][3]);
        if (ans[i][2]==2) printf("=%d\n",ans[i][1]-ans[i][3]);
        if (ans[i][2]==3) printf("=%d\n",ans[i][1]*ans[i][3]);
        if (ans[i][2]==4) printf("=%d\n",ans[i][1]/ans[i][3]);  //输出结果
    }
}

bool check()  //判断是否组成了24
{
    for (int i=1;i<=4;i++)
        if (a[i]==24) return 1;
    return 0;
}

void dfs(int k)
{
    if (k==4)  //搜索完毕
    {
        if (check())
        {
            print();
            ok=1;
        }
        return;
    }
    int x,y;
    for (int i=1;i<=4;i++)
        for (int j=1;j<=4;j++)  //枚举两个数字
            if (i!=j&&a[i]>0&&a[j]>0)
            {
                ans[k][1]=a[i];  //加
                ans[k][2]=1;
                ans[k][3]=a[j];
                x=a[i],y=a[j];
                a[i]=x+y;
                a[j]=-1;
                dfs(k+1);
                a[i]=x;
                a[j]=y;
                if (ok) return;
                
                /////////////////////////
                
                ans[k][1]=a[i];  //减
                ans[k][2]=2;
                ans[k][3]=a[j];
                x=a[i],y=a[j];
                a[i]=x-y;
                a[j]=-1;
                dfs(k+1);
                a[i]=x;
                a[j]=y;
                if (ok) return;
                
                ///////////////////////
                
                ans[k][1]=a[i];  //乘
                ans[k][2]=3;
                ans[k][3]=a[j];
                x=a[i],y=a[j];
                a[i]=x*y;
                a[j]=-1;
                dfs(k+1);
                a[i]=x;
                a[j]=y;
                if (ok) return;
                
                ///////////////////////
                
                if (a[j]>0&&a[i]%a[j]==0)  //除,注意要判断能否整除
                {
                    ans[k][1]=a[i];
                    ans[k][2]=4;
                    ans[k][3]=a[j];
                    x=a[i],y=a[j];
                    a[i]=x/y;
                    a[j]=-1;
                    dfs(k+1);
                    a[i]=x;
                    a[j]=y;
                    if (ok) return;
                }
            }
}

int main()
{
    scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4]);
    dfs(1);
    if (!ok) cout<<"No answer!";
    return 0;
}
<think>好的,我现在需要处理用户关于洛谷P4961题解的查询请求。首先,我得确认用户的问题是什么,以及如何根据提供的引用内容来回答。用户提到想查询洛谷P4961相关的题目解析或代码实现,但检查提供的引用内容,发现引用1到5中没有直接提到P4961的信息。这意味着需要告知用户当前没有可用的资料,同时提供其他帮助途径。 接下来,我需要按照系统级指令的要求来组织回答。必须使用中文,结构清晰,分步骤思考,并生成相关问题。同时,回答中如果有引用的话需要添加标识,但根据现有引用,可能无法直接引用,因此需要处理这种情况。 首先,确认用户的问题是否在引用中存在。仔细检查每个引用,引用1是关于排序的Python实现,引用2是P1634和P1639的题解,引用3是P1978集合题解,引用4是P10677题解,引用5是某个题解的补充知识。没有提到P4961,所以必须如实告知用户,无法提供直接的解析或代码,并建议其他方法,比如官方题解、社区讨论或搜索特定平台。 然后,考虑生成相关问题。根据常见的用户需求,可能涉及如何查找其他题号、题解途径、调试技巧、题目分类或测试用例获取。这些问题需要与用户的问题相关,并且有实际帮助。 最后,确保回答符合格式要求,如数学表达式的正确使用,但当前问题可能不涉及数学公式,所以可能不需要使用。但如果有变量或代码,仍需遵循规则。例如,在代码示例中要使用正确的格式。 总结步骤: 1. 检查引用内容,确认无P4961相关信息。 2. 告知用户当前无法提供该题解,并解释原因。 3. 提供替代建议,如官方题解、社区讨论、搜索引擎等。 4. 生成相关问题,帮助用户进一步解决可能的需求。 5. 确保回答结构清晰,符合格式要求,无Markdown,使用中文。 需要注意避免编造信息,保持回答真实可靠。同时,生成的建议要具体,比如提到洛谷官网、优快云、GitHub等平台,这样用户有明确的下一步行动方向。此外,生成的问题需要覆盖用户可能遇到的其他疑问,帮助他们扩展解决问题的途径。</think>关于洛谷P4961题目的解析及代码实现,经核查当前提供的引用资料中未包含该题目的具体信息[^1][^2][^3][^4][^5]。建议通过以下途径获取帮助: 1. **访问洛谷官方题解区**:在题目页面下方"讨论"或"题解"板块查找其他用户的解题思路 2. **优快云/博客园技术社区**:尝试搜索关键词`洛谷P4961 site:youkuaiyun.com` 或 `洛谷P4961 site:cnblogs.com` 3. **GitHub代码仓库**:部分法竞赛选手会在GitHub公开解题代码,搜索`Luogu P4961.cpp/py` 4. **题目分类分析**:根据题目编号判断属于数学问题(P4961为2017年普及组题目,可能涉及数论或模拟类题型) ```python # 示例代码框架(需根据实际题目要求补充) def p4961_solution(input_data): # 处理输入 n = int(input_data[0]) # 核心法逻辑 result = 0 # 返回输出 return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值