精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>算法集锦--------梦入玄机>>算24游戏的算法讨论>>金鹰的算24程序

主题:金鹰的算24程序
发信人: goldeagle()
整理人: yangcs(2000-03-09 14:46:06), 站内信件
我真是粗心,Test()中的错误改得不彻底,而且分数类中对除以0的错误
处理得不对,今天修改后一起再贴出来,应该不会错了。
大家帮忙看看,多谢了!

//CALC24.CPP
//计算24程序  goldeagle 2000-03-08

#include <stdlib.h>
#include <iostream.h>
#include "fraction.hpp"

struct CalcTest {
    int no[4];  // 数字
    int op[3];  // 运算符 + - * /
    int nx[3];  // 运算次序
};

int norder[24][4], noi=0;

fraction CalcOne(fraction f1, fraction f2, int o) {
    fraction s;
    switch (o) {
        case 0: s=f1+f2; break;
        case 1: s=f1-f2; break;
        case 2: s=f1*f2; break;
        case 3: s=f1/f2;
    }
    return s;
}

void PrintOut(CalcTest t) {      // 输出表达式
    static char cop[]="+-*/";
    int i, j, brackets[2][3]={{0,0,0},{0,0,0}};

    brackets[0][t.nx[0]-1]++;
    brackets[1][t.nx[0]-1]++;
    if (abs(t.nx[1]-t.nx[0])>1) {
        brackets[0][t.nx[1]-1]++;
        brackets[1][t.nx[1]-1]++;
    } else {
        if (t.nx[1]>t.nx[0]) {
            brackets[0][t.nx[0]-1]++;
            brackets[1][t.nx[1]-1]++;
        } else {
            brackets[0][t.nx[1]-1]++;
            brackets[1][t.nx[0]-1]++;
        }
    }
    for (i=0;i<4;i++) {
if (i<3) for (j=0;j<brackets[0][i];j++) cout<<'(';
cout<<t.no[i];
if (i>0) for (j=0;j<brackets[1][i-1];j++) cout<<')';
if (i<3) cout<<cop[t.op[i]];
}
cout<<endl;
}

void Test(CalcTest t) { // 检查算式结果是否24
fraction n[4];
int i, j, p[4], p1;
for (i=0;i<4;i++) {
n[i]=fraction(t.no[i], 1);
p[i]=i;
}
for (i=0;i<3;i++) {
n[p[t.nx[i]]]=CalcOne(n[p[t.nx[i]-1]], n[p[t.nx[i]]],
t.op[t.nx[i]-1]);
p1=p[t.nx[i]-1];
for (j=0;j<4;j++) if (p[j]==p1) p[j]=p[t.nx[i]];
}
if ((n[p[t.nx[2]]].getnumerator()==24)
&& (n[p[t.nx[2]]].getdenominator()==1))
PrintOut(t);
return;
}

void permutation(int a[], int m) { // 排列算法
int i, t;
if (m<3) {
permutation(a, m+1);
for (i=m+1;i<4;i++) {
t=a[m]; a[m]=a[i]; a[i]=t;
permutation(a, m+1);
t=a[m]; a[m]=a[i]; a[i]=t;
}
} else {
for (i=0;i<4;i++) norder[noi][i]=a[i];
noi++;
}
}

void calc24(int a[]) {
CalcTest t;
int i, j, k, n, ok;
for (i=0;i<24;i++) { // 24种排列
//去除因给定4数中有相同而产生的排列重复情况
ok=1;
for (j=0;(j<3)&&ok;j++)
for (k=j+1;(k<4)&&ok;k++)
if ((a[norder[i][j]]==a[norder[i][k]]) &&
(norder[i][j]>norder[i][k]))
                    ok=0;
        if (!ok) continue;
        for (j=0;j<4;j++)
t.no[j]=a[norder[i][j]];
for (j=0;j<64;j++) { // 64种运算符排列
n=j;
for (k=0;k<3;k++) {
t.op[k]=n%4;
n/=4;
}
for (k=0;k<6;k++) { // 6种运算次序
for (n=0;n<3;n++) t.nx[n]=norder[k][n+1];
if (!((t.nx[0]==3) && (t.nx[1]==1))) //除去312次序
Test(t);
}
}
}
}

int main() {
int a[]={0,1,2,3};
permutation(a, 0);
cout<<"Please input 4 numbers:";
cin>>a[0]>>a[1]>>a[2]>>a[3];
    calc24(a);
    return 0;
}


//FRACTION.HPP
//分数类  goldeagle 2000-03-08

class fraction {
    private:
        int numerator, denominator;
        void reduction(void);
    public:
        fraction(void);
        fraction(int, int);
        void setnumerator(int);
        void setdenominator(int);
        int getnumerator(void);
        int getdenominator(void);
        int iserror(void);
        fraction operator +(fraction a);
        fraction operator -(fraction a);
        fraction operator *(fraction a);
        fraction operator /(fraction a);
        fraction operator -();
};


//FRACTION.CPP
//分数类  goldeagle 2000-03-08

#include <math.h>
#include <iostream.h>
#include "fraction.hpp"

int maxcommondivisor(int a, int b) {
    a=abs(a);
    b=abs(b);
    while (a!=b) if (a<b) b-=a; else a-=b;
return a;
}

int mincommonmultiple(int a, int b) {
return a/maxcommondivisor(a,b)*b;
}

void fraction::reduction(void) {
int n;
if (iserror()) return;
if (numerator==0) {
numerator=0;
denominator=1;
} else {
numerator=abs(numerator)*(numerator<0?-1:1)*
(denominator<0?-1:1);
denominator=abs(denominator);
n=maxcommondivisor(numerator, denominator);
numerator/=n;
denominator/=n;
}
}

fraction::fraction(void) {
numerator=0;
denominator=1;
}

fraction::fraction(int n, int d) {
numerator=n;
denominator=d;
reduction();
}

int fraction::iserror() {
return (denominator==0);
}

void fraction::setnumerator(int n) {
numerator=n;
reduction();
}

void fraction::setdenominator(int d) {
denominator=d;
reduction();
}

int fraction::getnumerator(void) {
return numerator;
}

int fraction::getdenominator(void) {
return denominator;
}

fraction fraction::operator +(fraction a) {
fraction c;
int m, da, db;

if (iserror()||a.iserror()) return fraction(0,0);
m=mincommonmultiple(a.denominator, denominator);
da=m/a.denominator;
db=m/denominator;
c.numerator=a.numerator*da+numerator*db;
c.denominator=m;
c.reduction();
return c;
}

fraction fraction::operator -() {
fraction a(-numerator, denominator);
return a;
}

fraction fraction::operator -(fraction a) {
return *this+(-a);
}

fraction fraction::operator *(fraction a) {
fraction c;
if (iserror()||a.iserror()) return fraction(0,0);
c.numerator=a.numerator*numerator;
c.denominator=a.denominator*denominator;
c.reduction();
return c;
}

fraction fraction::operator /(fraction a) {
fraction c;
if (iserror()||a.iserror()) return fraction(0,0);
c.numerator=numerator*a.denominator;
c.denominator=denominator*a.numerator;
c.reduction();
return c;
}


--
行侠仗义吾本性,展翅翱翔天地间
请加入我创建的邮件列表“金鹰的程序员天地”:
(发一封空邮件到 [email protected]
再回复一封确认信就可以了)

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.182.36]

[关闭][返回]