//7966039    vrs570540852    3983    Accepted    388K    0MS    GCC    2312B    2010-12-04 13:38:18
//POJ 3983 第二届顶嵌杯决赛A题 计算4个数等于24
//搜索 数据较小,不用剪枝就过了
//利用类似层叠那样,每运算一次,就合并两个数,所以少一个数,每次计算的值都保存在curVal中
//注意浮点数1/3 *3 会等于1
//格式化输出时用到sprintf,挺不错的
#include<stdio.h>
#include<string.h>
#include<math.h>
#define bool int

 

int option[5];
int order[5];
float number[5];
float curVal[4][5];

//输出时用到的临时变量
char outputStr[15];
char outputStr2[15];
char tempStr[15];
char tempStr2[15];

 

bool bfs(int k)
{
    int m;
    if(k==3)
    {
        if(fabs(24.0-curVal[3][0])==0)
            return 1;
        else
            return 0;
    }
    else
    {
        int i,j;
        for(i=0;i<3-k;i++)
        {
            for(j=0;j<4;j++)
            {
                switch(j)
                {
                case 0:
                    curVal[k+1][i]=curVal[k][i]+curVal[k][i+1];
                    break;
                case 1:
                    curVal[k+1][i]=curVal[k][i]-curVal[k][i+1];
                    break;
                case 2:
                    curVal[k+1][i]=curVal[k][i]*curVal[k][i+1];
                    break;
                case 3:
                    curVal[k+1][i]=curVal[k][i]/curVal[k][i+1];
                    break;
                }
                for(m=0;m<i;m++)
                    curVal[k+1][m]=curVal[k][m];
                for(m=i+1;m<3-k;m++)
                    curVal[k+1][m]=curVal[k][m+1];
                option[k]=j;
                order[k]=i;
                if(bfs(k+1))
                    return 1;
            }
        }
    }
    return 0;
}

void OutPut()
{
    if(order[1]>=order[0])
        order[1]++;
    order[2]=3-order[0]-order[1];

    char op[4]={'+','-','*','/'};
    sprintf(outputStr,"(%d%c%d)",(int)number[order[0]],op[ option[0] ],(int)number[order[0]+1]);
    strcpy(tempStr,outputStr);
    if(abs(order[0]-order[1])==2)
    {
        sprintf(outputStr2,"(%d%c%d)",(int)number[order[1]],op[ option[1] ],(int)number[order[1]+1]);
        strcpy(tempStr2,outputStr2);
        if(order[0]<order[1])
            sprintf(outputStr,"%.*s%c%.*s",sizeof(tempStr),tempStr,op[ option[2] ],sizeof(tempStr2),tempStr2);
        else
            sprintf(outputStr,"%.*s%c%.*s",sizeof(tempStr2),tempStr2,op[ option[2] ],sizeof(tempStr),tempStr);
    }
    else
    {
        if(order[0]<order[1])
            sprintf(outputStr,"(%.*s%c%d)",sizeof(tempStr),tempStr,op[ option[1] ],(int)number[order[1]+1]);
        else
            sprintf(outputStr,"(%d%c%.*s)",(int)number[order[1]],op[ option[1] ],sizeof(tempStr),tempStr);
        strcpy(tempStr,outputStr);
        if(order[2]==2)
            sprintf(outputStr,"%.*s%c%d",sizeof(tempStr),tempStr,op[ option[2] ],(int)number[order[2]+1]);
        else
            sprintf(outputStr,"%d%c%.*s",(int)number[order[2]],op[ option[2] ],sizeof(tempStr),tempStr);
    }
    printf("%s\n",outputStr);
}
int main()
{
    int i;
    for(i=0;i<4;i++)
    {
        scanf("%f",&number[i]);
        curVal[0][i]=number[i];
    }
    bfs(0);
    OutPut();
    return 0;
}

posted on 2010-12-04 14:35  VRS  阅读(790)  评论(0编辑  收藏  举报