• uva10344


    Your task is to write a program that can decide whether you can find an arithmetic expression consisting of five given numbers (1<=i<=5) that will yield the value 23.
    For this problem we will only consider arithmetic expressions of the following from:

     
    where : {1,2,3,4,5} -> {1,2,3,4,5} is a bijective function
    and  {+,-,*} (1<=i<=4)

    Input

    The Input consists of 5-Tupels of positive Integers, each between 1 and 50.
    Input is terminated by a line containing five zero's. This line should not be processed.

    Output

    For each 5-Tupel print "Possible" (without quotes) if their exists an arithmetic expression (as described above) that yields 23. Otherwise print "Impossible".

    Sample Input

    1 1 1 1 1
    1 2 3 4 5
    2 3 5 7 11
    0 0 0 0 0

    Sample Output

    Impossible
    Possible
    Possible

     

    // 题意:输入5个整数,按照某种顺序排列后依次进行+, -或者*,使得最终结果为23。判断是否有解
    // 算法:回溯

    time 1.692

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    int a[5];
    int b[5];
    char op[5];
    int vis[5];
    int possible;
    
    
    void dfs(int d, int s)
    {
        if(d==5)
        {
            if(s==23)
            {
                possible=1;
    #ifndef ONLINE_JUDGE
                printf("(((%d ", b[0]);
                for(int i=1;i<4;i++)
                    printf("%c %d) ", op[i], b[i]);
                printf("%c %d ", op[4], b[4]);
                printf("
    ");
    #endif
            }
    
            return;
        }
    
        for(int i=0;i<5;i++)
        {
            //第一个数
            if(d==0)
            {
                if(!vis[i])
                {
                    vis[i]=1;
                    b[d]=a[i];
                    dfs(d+1, a[i]);
                    vis[i]=0;
                }
            }
            else
            {
                if(!vis[i])
                {
                    vis[i]=1;
                    b[d]=a[i];
                    op[d]='+';
                    dfs(d+1, s+a[i]);
                    op[d]='-';
                    dfs(d+1, s-a[i]);
                    op[d]='*';
                    dfs(d+1, s*a[i]);
                    vis[i]=0;
                }
            }
        }
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("./uva10344.in", "r", stdin);
    #endif
        while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5 
                && (a[0] || a[1] || a[2] || a[3] || a[4]))
        {
            possible=0;
            dfs(0, 0);
            if(possible)
                puts("Possible");
            else
                puts("Impossible");
        }
    
        return 0;
    }

    找到后立刻返回,time 0.945

    学习点,dfs时判断扩展点的返回值,如果已经成功,就直接返回。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    int a[5];
    int vis[5];
    
    
    bool dfs(int d, int s)
    {
        if(d==5)
            return s==23;
    
        for(int i=0;i<5;i++) if(!vis[i])
        {
    
            vis[i]=1;
            //第一个数
            if(d==0) { if(dfs(d+1, a[i])) return true; }
            else
            {
                if(dfs(d+1, s+a[i])) return true;
                if(dfs(d+1, s-a[i])) return true;
                if(dfs(d+1, s*a[i])) return true;
            }
            vis[i]=0;
        }
        return false;
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("./uva10344.in", "r", stdin);
    #endif
        while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5 
                && (a[0] || a[1] || a[2] || a[3] || a[4]))
        {
            memset(vis, 0, sizeof(vis));
            if(dfs(0, 0))
                puts("Possible");
            else
                puts("Impossible");
        }
    
        return 0;
    }

     

    next_permutation 计算差点超时: 2.388

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    int a[5];
    
    bool check(int k)
    {
        int s=a[0];
        for(int j=1;j<5;j++)
        {
            switch(k%3)
            {
                case 0:
                    s+=a[j]; break;
                case 1:
                    s-=a[j]; break;
                case 2:
                    s*=a[j]; break;
            }
            k/=3;
        }
        return s==23;
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("./uva10344.in", "r", stdin);
    #endif
        while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5 
                && (a[0] || a[1] || a[2] || a[3] || a[4]))
        {
            sort(a, a+5);
            int ok=0;
            do
            {
                for(int i=0;i<81;i++) if(check(i))
                {
                    ok=1;
                    break;
                }
            }while(!ok && next_permutation(a, a+5));
            if(ok)
                puts("Possible");
            else
                puts("Impossible");
        }
    
        return 0;
    }
  • 相关阅读:
    作业一
    工作日志(二)
    工作日志(三)
    工作日志(四)
    工作日志(一)
    团队项目开发日志(四)
    团队项目开发日志(三)
    团队项目开发日志(二)
    团队项目开发日志(一)
    第四次作业
  • 原文地址:https://www.cnblogs.com/cute/p/3872976.html
Copyright © 2020-2023  润新知