poj3983 算24点

来源:互联网 发布:预测算法java代码实现 编辑:程序博客网 时间:2024/06/05 03:04
#include<iostream>#include<fstream>using namespace std;char cf[4]={'+','-','*','/'};double f(double a,double b,int i){    if(i==0)        return a+b;    else if(i==1)        return a-b;    else if(i==2)        return a*b;    else{        if(b==0)            return 111111111111.1111;        return a*1.0/b;    }}int main(){    //ifstream cin("1.txt");    double a[4];    cin>>a[0]>>a[1]>>a[2]>>a[3];    string s[4];    s[0]=char('0'+(int)a[0]);    s[1]=char('0'+(int)a[1]);    s[2]=char('0'+(int)a[2]);    s[3]=char('0'+(int)a[3]);    bool fit=false;    //前两个先    for(int i=0;i<4;++i){        double val=f(a[0],a[1],i);        string str="("+s[0]+cf[i]+s[1]+")";        //先val,a[2]        for(int j=0;j<4;++j){            double val2=f(val,a[2],j);            string str2="("+str+cf[j]+s[2]+")";            for(int k=0;k<4;++k){                double val3=f(val2,a[3],k);                if(val3==24){                    string str3=str2+cf[k]+s[3];                    cout<<str3<<endl;                    return 0;                }            }        }        //先a[2],a[3]         for(int j=0;j<4;++j){            double val2=f(a[2],a[3],j);            string str2="("+s[2]+cf[j]+s[3]+")";            for(int k=0;k<4;++k){                double val3=f(val,val2,k);                if(val3==24){                    string str3=str+cf[k]+str2;                    cout<<str3<<endl;                    return 0;                }            }        }    }    //当中两个    for(int i=0;i<4;++i){        double val=f(a[1],a[2],i);        string str="("+s[1]+cf[i]+s[2]+")";        //先a[0],val        for(int j=0;j<4;++j){            double val2=f(a[0],val,j);            string str2="("+s[0]+cf[j]+str+")";            for(int k=0;k<4;++k){                double val3=f(val2,a[3],k);                if(val3==24){                    string str3=str2+cf[k]+s[3];                    cout<<str3<<endl;                    return 0;                }            }        }        //先val,a[3]         for(int j=0;j<4;++j){            double val2=f(val,a[3],j);            string str2="("+str+cf[j]+s[3]+")";            for(int k=0;k<4;++k){                double val3=f(a[0],val2,k);                if(val3==24){                    string str3=s[0]+cf[k]+str2;                    cout<<str3<<endl;                    return 0;                }            }        }    }    //最后两个    for(int i=0;i<4;++i){        double val=f(a[2],a[3],i);        string str="("+s[2]+cf[i]+s[3]+")";        //先a[0],a[1]        for(int j=0;j<4;++j){            double val2=f(a[0],a[1],j);            string str2="("+s[0]+cf[j]+s[1]+")";            for(int k=0;k<4;++k){                double val3=f(val,val2,k);                if(val3==24){                    string str3=str+cf[k]+str2;                    cout<<str3<<endl;                    return 0;                }            }        }        //先a[1],val         for(int j=0;j<4;++j){            double val2=f(a[1],val,j);            string str2="("+s[1]+cf[j]+str+")";            for(int k=0;k<4;++k){                double val3=f(a[0],val2,k);                if(val3==24){                    string str3=s[0]+cf[k]+str2;                    cout<<str3<<endl;                    return 0;                }            }        }    }    return 0;}
别人的代码如下:
#include <stdio.h>#include <string.h>#include <stdlib.h>//四种符号char operators[4] = {'+', '-', '*', '/'};//符号运算double calc( double a, int operatorr, double b){switch (operators[operatorr]){case '+':return a + b;break;case '-':return a - b;break;case '*':return a * b;break;case '/':return a / b;break;}}int calculator(int i, int j, int k, double a, double b, double c, double d){ if (calc(calc(a, i, b),j,calc(c, k, d)) - 24.0 == 0) { printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)\n",a, operators[i], b, operators[j], c, operators[k], d); return 1; } if (calc(calc(calc(a, i, b), j, c), k, d) - 24.0 == 0) { printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf)\n",a, operators[i], b, operators[j], c, operators[k], d); return 1; } if (calc(calc(a, i, calc(b, j, c)), k, d) - 24.0 == 0) { printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf)\n",a, operators[i], b, operators[j], c, operators[k], d); return 1; } if (calc(a, i, calc(calc(b, j, c), k, d)) - 24.0 == 0) { printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)\n",a, operators[i], b, operators[j], c, operators[k], d); return 1; } if (calc(a, i, calc(b, j, calc(c, k, d))) == 24.0) { printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))\n",a, operators[i], b, operators[j], c, operators[k], d); return 1; } return 0;}int main(){double a,b,c,d;while (scanf("%lf %lf %lf %lf", &a, &b, &c, &d) != EOF){for (int i = 0; i < 4; ++ i){for(int j = 0; j < 4; ++ j){for(int k = 0; k < 4; ++ k){if(calculator(i,j,k,a,b,c,d))//题目中说有唯一解,找到后直接跳出goto success;}}}success:continue;}return 0;}

0 0
原创粉丝点击