西西河

主题:【原创】将24进行到底 -- 泰让

共:💬28 🌺15
全看分页树展 · 主题 跟帖
家园 俺的程序惨不忍睹

忙活了一个星期天,参照highway兄得输出办法,终于把输出解决了,但程序已经惨不忍睹。早知花上一个周末,还不如把逆波兰表达式吃透。不敢再玩了,就先这样吧。这个程序如果没有输出的问题,我认为这个算法还是很不错的。4个数两两相运算,变成3个数,再两两相运算,变成2个数,最后得结果。如果没有输出,适用N个数。

#include<iostream>

#include<vector>

using namespace std;

#define N 4

int z = 0,k1=0,k2=0;

vector<double> Operand(4);

vector<int> Operator(3);

void print(vector<double> A,vector<int> op,int i);

void PRINT(vector<double> A,vector<int> op,int i); // (a#b)#(c#d)

void print_op(int i)

{

switch (i)

{

case 0 : cout<<" + "; break;

case 1 : cout<<" - "; break;

case 2 : cout<<" * "; break;

case 3 : cout<<" / "; break;

case 4 : cout<<" - "; break;

case 5 : cout<<" / "; break;

}

}

inline double operation(const double x,const double y,int i)

{

double res;

switch (i)

{

case 0 : res = x + y; break;

case 1 : res = x - y; break;

case 2 : res = x * y; break;

case 3 : res = x / y; break;

case 4 : res = y - x; break;

case 5 : res = y / x; break;

}

return res;

}

inline void rechnen(vector<double> a,int n)

{

if (n==2) // Rekursion end

{

for (int i=0;i<6;i++)

{

if (operation(a[0],a[1],i)==24.0)

{

z++;

int k3=0; if (i>3) k3++;

Operator[2]=i;

print(Operand,Operator,k1+k2+k3); cout<<endl;

break; // z.B. a+b=24, a#b(b#a)!=24

}

}

}

else

{

vector<double> b(n-1);

for (int u=0;u<n;u++)

{

for (int v=u+1;v<n;v++)

{

if (n==4) { Operand[0]=a[u]; Operand[1]=a[v]; }

if (n==3) { Operand[2]=a[v-u]; Operand[3]=a[3-v+u]; }

// A, B, C, D

for (int i=0,j=1;j<n-1;i++)

{ if (i!=u&&i!=v) b[j++]=a[i]; }

// "n=4" b[1],b[2]

// "n=3" b[1]

for (int i=0;i<6;i++)

{

Operator[4-n]=i;

// op[0], op[1]

b[0]=operation(a[u],a[v],i);

if (i>3) { if (n==4) k1=4; if (n==3) k2=2; }

if (n==3&&u==1)

// (a#b)#(c#d)

{

for (int i=0;i<6;i++)

{

if (operation(b[1],b[0],i)==24.0)

{

z++;

int k3=0; if (i>3) k3++;

Operator[2]=i;

PRINT(Operand,Operator,k1+k2+k3);

cout<<endl; break;

}

}

}

else rechnen(b,n-1);

k2=0;

if (n==4) k1=0;

}

}

}

}

}

int main()

{

while (1)

{

double f; vector<double> a(N);

cout<<"give me "<<N<<" nummer, please:"<<endl;

for (int i=0;i<N&&cin>>f;i++) a[i]=f;

// for (int i=0;i<4;i++) cout<<a[i]<<' ';

rechnen(a,N);

cout<<"\nso there are "<<z<<" kinds of ideas.\n\n";

}

return 0;

}

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河