| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 787 人关注过本帖
标题:求帮助!关于24点的问题 我编程不能找出所有的方法 但是自己不知道怎么改 请 ...
只看楼主 加入收藏
贪狼oo
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-7-21
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:9 
求帮助!关于24点的问题 我编程不能找出所有的方法 但是自己不知道怎么改 请求帮助,谢谢
输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1,1 输出 4*6*1*1 =24 (允许有括号)。
#include<stdio.h>
double Sum(double a,double b,int i)
{
    double sum;
    if(i==0)
        sum=a+b;
    else if(i==1)
        sum=a-b;
    else if(i==2)
        sum=a*b;
    else if(i==3)
    {
        if(b==0)
            return -1000000000000;
        else
            sum=a/b;
    }
    return sum;
}
int main()
{
    int i1,i2,i3,i4,j1,j2,j3,s[4];
    char a[4]={'+','-','*','/'};
    double s1,s2,s3;
    printf("请输入0-10之间的数:");
    scanf("%d%d%d%d",&s[0],&s[1],&s[2],&s[3]);
    printf("\n");
    for(i1=0;i1<4;i1++)
    {
        for(i2=0;i2<4;i2++)
        {

            if(i2!=i1)
            {
                for(j1=0;j1<4;j1++)
                {
                    s1=Sum(s[i1],s[i2],j1);
                    for(i3=0;i3<4;i3++)
                    {
                        if(i3!=i2&&i3!=i1)
                        {
                            for(j2=0;j2<4;j2++)
                            {
                                s2=Sum(s1,s[i3],j2);
                                for(i4=0;i4<4;i4++)
                                {
                                    if(i4!=i1&&i4!=i2&&i4!=i3)
                                    {
                                        for(j3=0;j3<4;j3++)
                                        {
                                            s3=Sum(s2,s[i4],j3);
                                            if(s3==24.0)
                                            {
                                                if((a[j1]=='+'||a[j1]=='-')&&(a[j2]=='*'||a[j2]=='/'))
                                                {printf("1q");
                                                    printf("(%d%c%d)%c%d%c%d=24\n",s[i1],a[j1],s[i2],a[j2],s[i3],a[j3],s[i4]);
                                                }
                                                else if((a[j2]=='+'||a[j2]=='-')&&(a[j3]=='*'||a[j3]=='/'))
                                                {printf("2q");
                                                    printf("(%d%c%d%c%d)%c%d=24\n",s[i1],a[j1],s[i2],a[j2],s[i3],a[j3],s[i4]);
                                                }
                                                else
                                                {printf("3q");
                                             printf("%d%c%d%c%d%c%d=24\n",s[i1],a[j1],s[i2],a[j2],s[i3],a[j3],s[i4]);
                                                }
                                       
                                            }
                                            if
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;

}
                                











搜索更多相关主题的帖子: 编程 include double return 
2011-12-06 22:50
bingfengX
Rank: 2
等 级:论坛游民
帖 子:29
专家分:40
注 册:2011-12-6
收藏
得分:0 
。。。
2011-12-06 22:54
贪狼oo
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-7-21
收藏
得分:0 
回复 2楼 bingfengX
不会啊
2011-12-06 22:55
bingfengX
Rank: 2
等 级:论坛游民
帖 子:29
专家分:40
注 册:2011-12-6
收藏
得分:0 
回复 3楼 贪狼oo
没那么好的耐力...
2011-12-06 23:01
贪狼oo
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-7-21
收藏
得分:0 
回复 4楼 bingfengX
例如6*8/(1+1)=24这样的式子时 括号在后面时 用语句输出时 总是晕晕的  给些提示就好
2011-12-06 23:05
bingfengX
Rank: 2
等 级:论坛游民
帖 子:29
专家分:40
注 册:2011-12-6
收藏
得分:5 
回复 5楼 贪狼oo
我理解能力不太好啊,能说得清楚点吗
2011-12-06 23:19
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
不带括号的还好一点   先写全排列  然后逆波兰求解

但是带括号的需要先判断生成的表达式是否正确  然后逆波兰  比较麻烦 给你个不带括号的吧
http://www.
程序代码:
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
int p[24][4] = {0};
int s = 0;
int data[4] = {0,1,2,3};
char dataopt[4] = {'+','-','*','/'};
void dfs(int mem[],bool foot[],int depth)
{
    if(4 == depth)
    {
        int i = 0;
        for(i = 0;i<4;i++)
            p[s][i] = mem[i];
        s++;return ;
    }
    int i;
    for(i = 0;i<4;i++)
    {
        if(!foot[i])
        {
            foot[i] = true;
            mem[depth] = data[i];
            dfs(mem,foot,depth+1);
            foot[i] = false;
        }
    }
}
int fun(int a,int b,char o)
{
    switch(o)
    {
    case '+':
        return a+b;
        break;
    case '-':
        return a-b;
        break;
    case '*':
        return a*b;
        break;
    case '/':
        return a%b?-100000:a/b;
        break;
    }
}
//1+2-4*3
int compute(int a[],char b[])
{
    bool h[50];
    h[42] = true;h[43] = false;
    h[45] = false;h[47] = true;
    int s1[10];
    char s2[10];
    int i = 0,j = 0,k = 0;
    int pa = 0,pb = 0;
    s1[pa++] = a[i++];
    s2[pb++] = b[j++];
    while(pb)
    {
        if(0 == k && i<4)
        {
            s1[pa++] = a[i++];
            k+=1;k%=2;
        }
        else
        {
            char temp = s2[pb-1];
            if(j<3 && h[b[j]]>h[temp])
                s2[pb++] = b[j++];
            else
            {
                int _a = s1[pa-1];
                pa--;
                int _b = s1[pa-1];
                pa--;
                char _o = s2[pb-1];
                pb--;
                s1[pa++] = fun(_b,_a,_o);
                if(j<3)
                s2[pb++] = b[j++];
            }
            k+=1;k%=2;
        }
    }
    return s1[pa-1];
}
int main()
{
    int i,j,k,t,m,n;
    scanf("%d",&n);
    getchar();
    bool foot[4] = {0};
    int mem[4] = {0};     
    dfs(mem,foot,0);
    while(n--)
    {
        int d[4];
        scanf("%d%d%d%d",d,d+1,d+2,d+3);        
        for(i = 0;i<24;i++)
        {
            int _temp[4] = {d[p[i][0]],d[p[i][1]],d[p[i][2]],d[p[i][3]]};
            for(j = 0;j<4;j++)
            {
                for(k = 0;k<4;k++)
                {
                    for(t = 0;t<4;t++)
                    {
                        char temp[3] = {dataopt[j],dataopt[k],dataopt[t]};
                        if(24 == compute(_temp,temp))
                        {
                            printf("Yes.\n");
                            break;
                        }
                    }
                    if(t!=4)
                        break;
                }
                if(k!=4)
                    break;
            }
            if(j!=4)
                break;
        }
        if(i == 24)
            printf("No.\n");
    }
    return 0;
}


                                         
===========深入<----------------->浅出============
2011-12-07 08:39
贪狼oo
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-7-21
收藏
得分:0 
回复 7楼 laoyang103
如果我接下来用if语句去判断1/24 ,能不能得出全部的答案?
2011-12-07 16:34
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:15 
把那些break去掉不就行了嘛

                                         
===========深入<----------------->浅出============
2011-12-07 17:11
贪狼oo
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-7-21
收藏
得分:0 
回复 9楼 laoyang103
感谢
2011-12-08 13:04
快速回复:求帮助!关于24点的问题 我编程不能找出所有的方法 但是自己不知道怎么 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024697 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved