• poj3983(牛人啊)


    View Code
    //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;
    }
    http://www.cnblogs.com/VRS_technology/archive/2010/12/04/1896383.html
  • 相关阅读:
    前置++和后置++的区别
    snmp数据包分析
    [codeforces538E]Demiurges Play Again
    [codeforces538D]Weird Chess
    [BZOJ3772]精神污染
    [BZOJ4026]dC Loves Number Theory
    [BZOJ1878][SDOI2009]HH的项链
    [BZOJ3658]Jabberwocky
    [BZOJ3932][CQOI2015]任务查询系统
    [BZOJ3551][ONTAK2010]Peaks加强版
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1971020.html
Copyright © 2020-2023  润新知