http://www.prcer.com/tools/24/24-1.html (经检验,不含病毒!)
这是原游戏网址,该算法速度相当快,求解相当全面.
这是原游戏网址,该算法速度相当快,求解相当全面.
解决方案 »
- 网站在ie下显示正常,在Chrome下字体改变以及个别图片没有显示出来
- 有没有办法以radio单选按钮的方式输出文档?
- 怎么注册带自定义属性的事件?请高手看清题目再回答。
- 为什么我的图片轮换不起来,请高手指点哦!
- 还未返回时的问题
- vb中的splash screen以html形式实现吗?
- 想动态改变文本框的maxlength属性,该怎么做呢?
- 用 div 与 span 实现有什么不同?
- 当鼠标放到按钮上,按钮颜色改变,鼠标离开按钮时,按钮颜色恢复.怎样实现?
- 天!!!怎么会是这样(ENTER键代替Tab键的问题)
- 急求,vml动态画组织结构图形
- IE7中window.open方法不能打开指定大小窗口?
function get24(n1,n2,n3,n4){
(s=String.prototype).r=s.replace;q:for(i in a=[n1,n2,n3,n4])for(j in a)for(k in a)for(l in a)if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l)for(m in b=["(x+y)","(x-y)","(x*y)","(x/y)","(y-x)","(y/x)"])for(n in b)for(o in b)if((d=Math.abs)(eval(s=b[o].r(x="x",b[n].r(x,p=b[m].r(x,a[i]).r(y="y",a[j])).r(y,g=a[k])).r(y,h=a[l]))-24)<0.01||d(eval(s=b[n].r(x,p).r(y,b[o].r(x,g).r(y,h)))-24)<0.01){alert(s+"=24");break q;}
}
get24(8,2,4,6);
</script>
function get24(n1,n2,n3,n4){
(s=String.prototype).r=s.replace;
q:for(i in a=[n1,n2,n3,n4])
for(j in a)
for(k in a)
for(l in a)
if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l)
for(m in b=["(x+y)","(x-y)","(x*y)","(x/y)","(y-x)","(y/x)"])
for(n in b)
for(o in b)
if((d=Math.abs)(eval(s=b[o].r(x="x",b[n].r(x,p=b[m].r(x,a[i]).r(y="y",a[j])).r(y,g=a[k])).r(y,h=a[l]))-24) <0.01||d(eval(s=b[n].r(x,p).r(y,b[o].r(x,g).r(y,h)))-24) <0.01)
{alert(s+"=24");break q;}
} 穷举啊,楼主给的是显示所有结果,要是穷举…………
#include <iostream>
#include <cstdlib>
#include <string>
#include <time.h>
#include <algorithm>
#include <cstring>
#include <Stack>
#include <cmath>
using namespace std;
const int squeezer[]={1,2,3,4,5,6,7,8,9,10,11,12,13,
1,2,3,4,5,6,7,8,9,10,11,12,13,
1,2,3,4,5,6,7,8,9,10,11,12,13,
1,2,3,4,5,6,7,8,9,10,11,12,13};
const char operate[]={'+','-','*','/'};
string total[10000];
class num{
public:
double val;
string s;
bool sign;
} OperateNumA[4],OperateNumB[4];
bool IsFind;
int count_num;
stack<long double>s2;int icp(char ch)
{
if (ch>='a'&&ch<='i') return 8;
else if(ch=='^') return 6;
else if (ch=='*'||ch=='/') return 4;
else if (ch=='+'||ch=='-') return 2;
else if(ch==')') return 1;
else if(ch=='(') return 10;
else return 0;
}
int isp(char ch)
{
if (ch>='a'&&ch<='i') return 9;
else if(ch=='^') return 7;
else if (ch=='*'||ch=='/') return 5;
else if (ch=='+'||ch=='-') return 3;
else if(ch==')') return 10;
else if(ch=='(') return 1;
else return 0;
}
bool isnum(char ch)
{
if (ch>='0' &&ch<='9') return 1;
return 0;
}void GetOperands(long double&op1,long double&op2)
{
op1=s2.top();
s2.pop();
op2=s2.top();
s2.pop();
}
void DoOperator(char oper)
{
long double oper1,oper2;
GetOperands(oper1,oper2);
switch(oper)
{
case '+':s2.push(oper2+oper1);break;
case '-':s2.push(oper2-oper1);break;
case '*':s2.push(oper2*oper1);break;
case '/':s2.push(oper2/oper1);break;
}
}
void run(char t1[][10],int count)
{
if (t1[count][1]!='#')
{
long double temp2;
switch(t1[count][1])
{
case '+':
case '-':
case '*':
case '/':DoOperator(t1[count][1]);break;
default:temp2=atof(t1[count]);s2.push(temp2);break;
}
}
}
long double f(string s)
{
char temp[10];
memset(temp,0,sizeof(temp));
stack<char> s1;
s1.push('#');
int count(-1),i(0),flag(1);
char t1[100][10],y;
memset(t1,0,sizeof(t1));
while (i!=s.size())
{
if (isnum(s[i])||(s[i]=='-'&&!isnum(s[i-1])&&isnum(s[i+1])))
{
string tmp=s.substr(i,s.size());
long double t=atof(tmp.data());
count++;
gcvt(t,8,t1[count]);
i++;
for (;isnum(s[i])||s[i]=='.';i++);
flag=0;
run(t1,count);
}
else if(s[i]==')')
for (y=s1.top(),s1.pop();y!='(';y=s1.top(),s1.pop())
{
count++;
t1[count][1]=y;
run(t1,count);
}
else{
for (y=s1.top(),s1.pop();icp(s[i])<isp(y);y=s1.top(),s1.pop())
{
count++;
t1[count][1]=y;
run(t1,count);
}
s1.push(y);
s1.push(s[i]);
}
if (flag) i++;
else flag=1;
}
while (!s1.empty())
{
count++;
t1[count][1]=s1.top();
s1.pop();
run(t1,count);
}
return s2.top();
}
void dfs(int dep)
{
int i,j,l;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{
if (i!=j&&!OperateNumA[i].sign&&!OperateNumB[j].sign)
{
for (l=0;l<4;l++)
{
if (l==1&&(OperateNumA[i].val<OperateNumB[j].val)) continue;
double tmp=OperateNumA[i].val;
switch(l)
{
case 0:OperateNumA[i].val+=OperateNumB[j].val;break;
case 1:OperateNumA[i].val-=OperateNumB[j].val;break;
case 2:OperateNumA[i].val*=OperateNumB[j].val;break;
case 3:OperateNumA[i].val/=OperateNumB[j].val;break;
}
OperateNumB[j].sign=1;
OperateNumA[j].sign=1;
string temp=OperateNumA[i].s;
OperateNumA[i].s+=operate[l];
OperateNumA[i].s+=OperateNumB[j].s;
OperateNumB[i]=OperateNumA[i];
double mistake=OperateNumA[i].val-24.0;
int result=int(OperateNumA[i].val);
if (dep!=1)
{
OperateNumA[i].s.insert(0,"(");
OperateNumA[i].s+=")";
OperateNumB[i]=OperateNumA[i];
dfs(dep-1);
}
else if (!(mistake>0)&&(result==24))
{
total[count_num++]=OperateNumA[i].s;
}
OperateNumB[j].sign=0;
OperateNumA[j].sign=0;
OperateNumA[i].s=temp;
OperateNumA[i].val=tmp;
OperateNumB[i]=OperateNumA[i];
}
}
}
}
int main()
{
while(count_num<=0)
{
srand(time(0));
for (int i=0;i<4;i++)
{
OperateNumA[i].val=0;
OperateNumA[i].s="";
OperateNumA[i].sign=0;
OperateNumB[i].val=0;
OperateNumB[i].s="";
OperateNumB[i].sign=0;
}
for (int k=0;k<4;k++)
{
OperateNumA[k].val=OperateNumB[k].val=squeezer[rand()%52];
if (OperateNumA[k].val>9) OperateNumA[k].s=OperateNumB[k].s=char(int(OperateNumA[k].val)+55);
else OperateNumA[k].s=OperateNumB[k].s=char(int(OperateNumA[k].val)+48);
}
count_num=0;
dfs(3);
}
cout<<"电脑给出的四个数为:"<<endl;
cout<<OperateNumA[0].val<<' '<<OperateNumA[1].val<<' '<<OperateNumA[2].val<<' '<<OperateNumA[3].val<<endl;
cout<<"请给出你的正确答案:"<<endl;
string s;
cin>>s;
long double fm,mis;
fm=f(s);
mis=fm-24.0;
int result2=int(fm);
if (!(mis>0)&&result2==24) cout<<"正确"<<endl;
else
{
cout<<"错误"<<endl;
cout<<"请看正确答案"<<endl;
sort(total,total+count_num);
string pre="";
for (int loop=0;loop<count_num;loop++)
{
if (total[loop]!=pre)
{
int len=total[loop].size();
for (int l1=0;l1<len;l1++)
{
if (total[loop][l1]>='A'&&total[loop][l1]<='D')
cout<<int(total[loop][l1])-55;
else cout<<total[loop][l1];
}
cout<<endl;
pre=total[loop];
}
}
}
system("pause");
return 0;
} 这是我用C++写的24点..主要用到了表达式计算和DFS..
没做界面..在命令行下的.
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
double calculate ( int m, double first, double second)
{
double result;
switch(m)
{
case 0:
result = first + second;
break;
case 1:
result = first - second;
break;
case 2:
result = first * second;
break;
case 3:
result = first / second;
break;
}
return result;
}void print( int i, int j, int k,const vector<double> &a )
{
char d, b, c;
switch (i)
{
case 0:
b = '+';
break;
case 1:
b = '-';
break;
case 2:
b = '*';
break;
case 3:
b = '/';
break;
}
switch (j)
{
case 0:
c = '+';
break;
case 1:
c = '-';
break;
case 2:
c = '*';
break;
case 3:
c = '/';
break;
}
switch (k)
{
case 0:
d = '+';
break;
case 1:
d = '-';
break;
case 2:
d = '*';
break;
case 3:
d = '/';
break;
}
cout <<"(("<< a[0] << d << a[1] <<')'<< c << a[2] << ")"<< b << a[3] << endl;
}double fn ( const vector <double> &a )
{
double first;
for ( int i = 0; i <= 3; i++ )
{
for ( int j = 0; j <= 3; j++ )
{
for ( int k = 0; k <= 3; k++ )
{
first = calculate( i, calculate ( j , calculate(k, a[0],a[1]), a[2]),a[3]);
if ( abs(first - 24) < 0.0000001 )
print( i,j,k,a );
}
}
}
}
int main()
{
vector <double> a;
double c;
for ( int i = 0; i < 4; i++ )
{
cout << "请输入第 " << i + 1 << "个数" <<endl;
cin >> c;
a.push_back(c);
} sort(a.begin(), a.end());
fn ( a ); while ( next_permutation ( a.begin(), a.end()))
fn ( a ); system("pause");
return 0;}
海浪的这算法好啊
MARK