求助
查看原帖
求助
1295142
封禁用户楼主2024/4/10 19:49
 #include <iostream>
  #include <set>
 #include <string>
  #include <cmath>
  using namespace std;
  #define N    4  
  #define RES    24
  #define EPS 1e-6
 
 struct Elem
 {
    Elem(double r, string& i):res(r),info(i){}
    Elem(double r, char* i):res(r),info(i){}
     double res;   
     string info; 
     bool operator<(const Elem& e) const
     {
         return res < e.res;
     }
 };
 
 int A[N];  set<Elem> vset[1<<N];  
 
 set<Elem>& Fork(int m)
 {
     if (vset[m].size())
     {
         return vset[m];
     }
     for (int i=1; i<=m/2; i++)
         if ((i&m) == i)
         {
             set<Elem>& s1 = Fork(i);
            set<Elem>& s2 = Fork(m-i);
            set<Elem>::iterator cit1;
             set<Elem>::iterator cit2;
             for (cit1=s1.begin(); cit1!=s1.end(); cit1++)
                 for (cit2=s2.begin(); cit2!=s2.end(); cit2++)
                 {
                     string str;
                     str = "("+cit1->info+"+"+cit2->info+")";
                     vset[m].insert(Elem(cit1->res+cit2->res,str));
                     str = "("+cit1->info+"-"+cit2->info+")";                     vset[m].insert(Elem(cit1->res-cit2->res,str));
                     str = "("+cit2->info+"-"+cit1->info+")";;
                     vset[m].insert(Elem(cit2->res-cit1->res,str));
                    str = "("+cit1->info+"*"+cit2->info+")";
                     vset[m].insert(Elem(cit1->res*cit2->res,str));
                    if (abs(cit2->res)>EPS) 
                    {
                         str = "("+cit1->info+"/"+cit2->info+")";
                       vset[m].insert(Elem(cit1->res/cit2->res,str));
58                     }
59                     if (abs(cit1->res)>EPS)
                   {
                        str = "("+cit2->info+"/"+cit1->info+")";
62                         vset[m].insert(Elem(cit2->res/cit1->res,str));
                     }
                 }
         }
     return vset[m];
 }
 
 int main()
 {
     int i;
     for (i=0; i<N; i++)
         cin >> A[i];
     for (i=0; i<N; i++)
     {
         char str[10];
        sprintf(str,"%d",A[i]);
         vset[1<<i].insert(Elem(A[i],str));
    }
     Fork((1<<N)-1);
     set<Elem>::iterator it;
     for (it=vset[(1<<N)-1].begin(); 
        it!=vset[(1<<N)-1].end(); it++)
         {
             if (abs(it->res-RES) < EPS)
                 cout << it->info << endl;
     }
 }
2024/4/10 19:49
加载中...