zoukankan      html  css  js  c++  java
  • 【洛谷P1236】算24点【搜索】

    题目大意:

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


    思路:

    很显然的搜索嘛。
    可以考虑每次枚举使用那两个数字进行运算,然后再枚举使用哪一种运算方法(加减乘除)。把用过的数字修改成-1.最终搜索完之后判断有没有一个数字变成了24即可。
    思路还是比较简单,注意细节即可。
    时间复杂度: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
    ",ans[i][1]+ans[i][3]);
            if (ans[i][2]==2) printf("=%d
    ",ans[i][1]-ans[i][3]);
            if (ans[i][2]==3) printf("=%d
    ",ans[i][1]*ans[i][3]);
            if (ans[i][2]==4) printf("=%d
    ",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;
    }
    
  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998283.html
Copyright © 2011-2022 走看看