正文

简单去冗余解的24点解法2007-03-25 20:11:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yzfy/24277.html

分享到:

本程序并不能去掉全部冗余解,只是去掉一部分,并且写的尽可能简单,仅供大家参考。(注意:直接复制本段代码是无法正常运行的,除非手动重写-,-嘿嘿)

#include <stdio.h> 
#define forT        for(t2=t1;t2<3;t2++)t[t2]=t[t2+1];
#define GetNum(n)    {if(t1>0 && t[t1-1]==t[t1])continue;n=t[t1];forT}
#define isTrue        if(23.9999<total && total<24.0001)
#define argment        n1,GetSym(sym1),n2,GetSym(sym2),n3,GetSym(sym3),n4
#define pt(str)        printf(str,argment);SearchCount++;continue;
#define fsym(s)        for(long s=0;s<4;s++)
#define isSct(s1,s2)    if(!(s1==1 && s2<=1 || s1==3 && s2>=2))
#define tct            total=count
char GetSym(long symbol) 

    switch(symbol) 
    { 
    case 0: return '+'; 
    case 1: return '-'; 
    case 2: return '*'; 
    default: return '/'; 
    } 

double count(double num1,double num2,long symbol) 
{
    switch(symbol) 
    { 
    case 0: if(num1>=num2)return num1+num2;else return -1e10; 
    case 1: if(num2!=0)return num1-num2;else return -1e10; 
    case 2: if(num1>=num2)return num1*num2;else return -1e10; 
    default:if((num2<-0.0001 || 0.0001<num2)&& num2!=1)
                return num1/num2;else return -1e10; 
    } 

int main(int argc, char* argv[]) 
{//雨中飞燕之作
    long m[4],SearchCount=0,n1,n2,n3,n4; 
    printf("Input 4 Numbers(a,b,c,d):\n"); 
    scanf("%d,%d,%d,%d",&m[0],&m[1],&m[2],&m[3]); 
    for(n2=0;n2<3;n2++)for(n1=3;n1>=n2;n1--)
        if(m[n1]>m[n1+1])n3=m[n1+1],m[n1+1]=m[n1],m[n1]=n3;
    for(long z1=0;z1<24;z1++)
    {
        long z2=z1 % 6,t1=z1/6,t2,t[4]={m[0],m[1],m[2],m[3]};
        GetNum(n1)t1=z2/2;z2%=2;GetNum(n2)t1=z2;GetNum(n3)n4=t[0];
        fsym(sym1)fsym(sym2)fsym(sym3) 
        { 
            double total,total2=count(n3,n4,sym3);
            tct(n1,n2,sym1);tct(total,n3,sym2);tct(total,n4,sym3); 
            isTrue{pt("((%d%c%d)%c%d)%c%d\n")}
            tct(n2,n3,sym2);tct(n1,total,sym1);tct(total,n4,sym3); 
            isSct(sym1,sym2)isTrue{pt("(%d%c(%d%c%d))%c%d\n")}
            tct(n2,n3,sym2);tct(total,n4,sym3);tct(n1,total,sym1); 
            isSct(sym3,sym2)isTrue{pt("%d%c((%d%c%d)%c%d)\n")}
            tct(n3,n4,sym3);tct(n2,total,sym2);tct(n1,total,sym1); 
            isSct(sym1,sym2)isSct(sym3,sym2)
            isTrue{pt("%d%c(%d%c(%d%c%d))\n")}
            tct(n1,n2,sym1);tct(total,total2,sym2); 
            isTrue{pt("(%d%c%d)%c(%d%c%d)\n")}
        }
    }
    printf("Total=%d\t",SearchCount);return 0;

阅读(4233) | 评论(6)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册