主题:【原创】将24进行到底 -- 泰让
忙活了一个星期天,参照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;
}
- 相关回复 上下关系8
🙂【原创】将24进行到底 5 泰让 字2476 2007-03-05 22:13:13
🙂俺的程序惨不忍睹
🙂看了N遍 泰让 字207 2007-03-13 20:08:18
🙂是的,就是输出搞不定 面壁 字2114 2007-03-14 07:54:43
🙂inline 1 泰让 字364 2007-03-15 06:54:23
😁哈,这下彻底清楚啦! 牛! 面壁 字0 2007-03-15 15:27:39
🙂为什么要用double类型,难道32位的整型不够么?另外, 请尽量 字144 2007-03-13 19:39:12
🙂整形? 面壁 字394 2007-03-14 08:12:51