实现24点游戏-穷举法

来源:互联网 发布:中国微观数据库 编辑:程序博客网 时间:2024/05/16 03:47

算法设计思路:

         穷举法就是列出4个数字加减乘除的各种可能性。首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,*,/,(,)。其中有效的表达式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表达式。其中a,b,c,d的范围是1到13。用随机函数产生四个1-13的数。要实现24点的算法,就是通过4个数字,4个运算符号和2对括号(最多为2对),通过各种组合判断其结果是否为24。我们用a,b,c,d代替4个数字。考虑每种可能,总的算法就有7种可能。

1没括号的(形如a*b*c*d);

2有括号的(形如(a * b) * c * d);

3有括号的(形如(a * b * c) * d);

4有括号的(形如a * (b * c) * d);

5有括号的(形如(a * b) * (c * d));

6有括号的(形如((a * b) * c) * d);

7有括号的(形如(a * (b * c)) * d)。

我的程序对运算式子进行穷举,去掉等价的和无效的,最终合法表达式只有73种。

/*File name:24点游戏.cppAuthor:杨柳Date:2017.4.5Function list:int Calculate ( float x, float y, float z, float w)IDE:DEV-c++ */#include <iostream> #include <stdlib.h>using namespace std; int flag=1;int main() { int Calculate ( float x, float y, float z, float w);//函数声明 while(flag){float a,b,c,d; int x;cout<<"随机输入4个数据"<<endl;     a=rand()%13+1;cout<<" 第一个数:"<<a<<endl;b=rand()%13+1; cout<<" 第二个数:"<<b<<endl;c=rand()%13+1; cout<<" 第三个数:"<<c<<endl; d=rand()%13+1;cout<<" 第四个数:"<<d<<endl;     cout<<"输出所有算法如下:"<<endl; Calculate (a,b,c,d); cout<<"退出请按0 or 继续请按1"<<endl;    cin>>x;    if(x==0)       flag=0;  }return 0;   }   int Calculate ( float x, float y, float z, float w) // a .b.c.d 的所有排列组合情况和运算表达式的所有情况{ if(x*y-z+w==24)    cout<<x<<"*"<<y<<"-"<<z<<"+"<<w<<"=24"<<endl; if ((x-y)*z*w==24)     cout<<"("<<x<<"-"<<y<<")"<<"*"<<z<<"*"<<w<<"=24"<<endl;if ((x*y)+(z*w)==24) cout<<"("<<x<<"*"<<y<<")+("<<z<<"*"<<w<<")"<<"=24"<<endl; if ((x+y)*z*w==24) cout<<"("<<x<<"+"<<y<<")"<<"*"<<z<<"*"<<w<<")"<<"=24"<<endl;if (x*y*z*w==24) cout<<x<<"*"<<y<<"*"<<z<<"*"<<w<<"=24"<<endl; if ((x+y*z)*w==24) cout<<"("<<x<<"+"<<y<<"*"<<z<<")"<<"*"<<w<<"=24"<<endl; if ((x*y-z)*w==24) cout<<"("<<x<<"*"<<y<<"-"<<z<<")"<<"*"<<w<<"=24"<<endl; if ((x*y)+z+w==24) cout<<"("<<x<<"*"<<y<<")+"<<z<<"+"<<w<<"=24"<<endl; if ((x/y-z)*w==24) cout<<"("<<x<<"/"<<y<<"-"<<z<<")"<<"*"<<w<<"=24"<<endl; if ((x-(y-z))*w==24) cout<<"("<<x<<"-"<<"("<<y<<"-"<<z<<")"<<")*"<<w<<"=24"<<endl;if (x-(y-z-w)==24) cout<<x<<"-"<<"("<<y<<"-"<<z<<"-"<<w<<")"<<"=24"<<endl;if (x+y-(z-w)==24) cout<<x<<"+"<<y<<"-"<<"("<<z<<"-"<<w<<")"<<"=24"<<endl;if (x*(y/z-w)==24) cout<<x<<"*"<<"("<<y<<"/"<<z<<"-"<<w<<")"<<"=24"<<endl;if ((x-y*z)*w==24) cout<<"("<<x<<"-"<<y<<"*"<<z<<")"<<"*"<<w<<"=24"<<endl;if (x*(y-z)+w==24) cout<<x<<"*"<<"("<<y<<"-"<<z<<")"<<"+"<<w<<"=24"<<endl;if (x+y+z/w==24) cout<<x<<"+"<<y<<"+"<<z<<"/"<<w<<"=24"<<endl; if ((x-y)*(z-w)==24)     cout<<"("<<x<<"-"<<y<<")*("<<z<<"-"<<w<<")=24"<<endl; if ((x+y)*z/w==24) cout<<"("<<x<<"+"<<y<<")*"<<z<<"/"<<w<<"=24"<<endl;     if (x*y/(z-w)==24) cout<<x<<"*"<<y<<"/"<<"("<<z<<"-"<<w<<")"<<"=24"<<endl; if ((x+y)*(z+w)==24)     cout<<"("<<x<<"+"<<y<<")*("<<z<<"+"<<w<<")=24"<<endl;if ((x-y)*z/w==24)     cout<<"("<<x<<"-"<<y<<")*"<<z<<"/"<<w<<"=24"<<endl; if (x+(y+z)/w==24) cout<<x<<"+"<<"("<<y<<"+"<<z<<")"<<"/"<<w<<"=24"<<endl;if (x*y/(z+w)==24) cout<<x<<"*"<<y<<"/"<<z<<"+"<<w<<")"<<"=24"<<endl; if ((x+y)*z/w==24) cout<<"("<<x<<"+"<<y<<")*"<<z<<"/"<<w<<"=24"<<endl; if ((x*y+z)*w==24) cout<<"("<<x<<"*"<<y<<"+"<<z<<")"<<"*"<<w<<"=24"<<endl; if ((x*y-z)/w==24) cout<<"("<<x<<"*"<<y<<"-"<<z<<")"<<"/"<<w<<"=24"<<endl; if ((x/y+z)*w==24) cout<<"("<<x<<"/"<<y<<"+"<<z<<")"<<"*"<<w<<"=24"<<endl; if ((x*y)/z/w==24) cout<<"("<<x<<"*"<<y<<")/"<<z<<"/"<<w<<"=24"<<endl;if (x+y+z-w==24) cout<<x<<"+"<<y<<"+"<<z<<"-"<<w<<"=24"<<endl;if (x-(y-z)+w==24) cout<<x<<"-"<<"("<<y<<"-"<<z<<")"<<"+"<<w<<"=24"<<endl;if (x/(y-z/w)==24) cout<<x<<"/"<<"("<<y<<"-"<<z<<"/"<<w<<")"<<"=24"<<endl;if (x+(y-z)*w==24) cout<<x<<"+"<<"("<<y<<"-"<<z<<")*"<<w<<"=24"<<endl;if ((x+y+z)*w==24) cout<<"("<<x<<"+"<<y<<"+"<<z<<")*"<<w<<"=24"<<endl; if ((x+y+z)*w==24) cout<<"("<<x<<"+"<<y<<"+"<<z<<")*"<<w<<"=24"<<endl; if (x+y*z-w==24) cout<<x<<"+"<<y<<"*"<<z<<"-"<<w<<"=24"<<endl; if (x*y-z/w==24) cout<<x<<"*"<<y<<"-"<<z<<"/"<<w<<"=24"<<endl; if ((x+y)*z-w==24) cout<<"("<<x<<"+"<<y<<"*"<<z<<"-"<<w<<"=24"<<endl; if ((x-y/z)*w==24) cout<<"("<<x<<"-"<<y<<"/"<<z<<")*"<<w<<"=24"<<endl; if (x*(y+z)+w==24) cout<<x<<"*"<<"("<<y<<"+"<<z<<")"<<"+"<<w<<"=24"<<endl;if ((x*y)+(z/w)==24) cout<<"("<<x<<"*"<<y<<")-("<<z<<"/"<<w<<")"<<"=24"<<endl;if ((x*y)/z-w==24) cout<<"("<<x<<"*"<<y<<")/"<<z<<"-"<<w<<"=24"<<endl; if ((x+y/z)*w==24) cout<<"("<<x<<"+"<<y<<"/"<<z<<")*"<<w<<"=24"<<endl; if ((x*y*z)/w==24) cout<<"("<<x<<"*"<<y<<"*"<<z<<")/"<<w<<"=24"<<endl;if ((x+y*z)/w==24) cout<<"("<<x<<"+"<<y<<"*"<<z<<")/"<<w<<"=24"<<endl;if (x+(y*z)+w==24) cout<<x<<"+"<<"("<<y<<"*"<<z<<")+"<<w<<"=24"<<endl;if (x-(y+z)*w==24) cout<<x<<"-("<<y<<"+"<<z<<")*"<<w<<"=24"<<endl;if (x-(y-z)*w==24) cout<<x<<"-("<<y<<"-"<<z<<")*"<<w<<"=24"<<endl;if ((x*y)-z-w==24) cout<<"("<<x<<"*"<<y<<")-"<<z<<"-"<<w<<"=24"<<endl;if (x+y/z+w==24)     cout<<x<<"+"<<y<<"/"<<z<<"+"<<w<<"=24"<<endl;if ((x-y)*z-w==24)     cout<<"("<<x<<"-"<<y<<"*"<<z<<"-"<<w<<"=24"<<endl;if ((x+y)/z+w==24)     cout<<"("<<x<<"+"<<y<<"/"<<z<<"+"<<w<<"=24"<<endl;if ((x*y)+z-w==24) cout<<"("<<x<<"*"<<y<<")+"<<z<<"-"<<w<<"=24"<<endl;if ((x/y)+z+w==24) cout<<"("<<x<<"/"<<y<<"+"<<z<<"+"<<w<<"=24"<<endl;if ((x*y)*z-w==24) cout<<"("<<x<<"*"<<y<<")*("<<z<<")-"<<w<<"=24"<<endl;if ((x*y+z)/w==24) cout<<"("<<x<<"*"<<y<<"+"<<z<<")/"<<w<<"=24"<<endl;if (x+y+z*w==24) cout<<x<<"+"<<y<<"+"<<z<<"*"<<w<<"=24"<<endl;if (x*(y-z)/w==24) cout<<x<<"*"<<"("<<y<<"-"<<z<<")/"<<w<<"=24"<<endl;if (x/y*z+w==24) cout<<x<<"/"<<y<<"*"<<z<<"+"<<w<<"=24"<<endl;if (x+y*z*w==24) cout<<x<<"+"<<y<<"*"<<z<<"*"<<w<<"=24"<<endl;if (x+y+z+w==24) cout<<x<<"+"<<y<<"+"<<z<<"+"<<w<<"=24"<<endl;if ((x*y)/(z*w)==24) cout<<"("<<x<<"*"<<y<<")/("<<z<<"*"<<w<<")"<<"=24"<<endl; if (x+(y+z)*w==24) cout<<x<<"+("<<y<<"+"<<z<<")*"<<w<<"=24"<<endl; if ((x-y)*z+w==24) cout<<"("<<x<<"-"<<y<<"*"<<z<<"+"<<w<<"=24"<<endl; if ((x+y+z)/w==24) cout<<"("<<x<<"+"<<y<<"+"<<z<<")/"<<w<<"=24"<<endl; if ((x+y)*z+w==24)     cout<<"("<<x<<"+"<<y<<")*"<<z<<"+"<<w<<"=24"<<endl; if ((x*y)*z+w==24) cout<<"("<<x<<"*"<<y<<")*("<<z<<")+"<<w<<"=24"<<endl; if ((x*y)-(z-w)==24) cout<<"("<<x<<"*"<<y<<")-("<<z<<"-"<<w<<")"<<"=24"<<endl;if ((x*y)-(z+w)==24) cout<<"("<<x<<"*"<<y<<")-("<<z<<"+"<<w<<")"<<"=24"<<endl; if ((x-y-z)*w==24) cout<<"("<<x<<"-"<<y<<"-"<<z<<")*"<<w<<"=24"<<endl; if ((x*y)/z+w==24) cout<<"("<<x<<"*"<<y<<")/"<<z<<"+"<<w<<"=24"<<endl; if ((x+y-z)*w==24) cout<<"("<<x<<"+"<<y<<"-"<<z<<")*"<<w<<"=24"<<endl; if (x/(y/z-w)==24) cout<<x<<"/("<<y<<"/"<<z<<"-"<<w<<")=24"<<endl;  if ((x*y)-(z*w)==24) cout<<"("<<x<<"*"<<y<<")-("<<z<<"*"<<w<<")"<<"=24"<<endl; //else //cout<<"不可以组成24"<<endl; return 0; }


最终效果图



                                             
0 0
原创粉丝点击