24点游戏,这个只是让你输入4个数,判断是否可以构成24点。理解了感觉不是太难。
大致思路:一开始从四个数里面挑两个数进行运算,然后和剩下的数放入一个数组中继续判断,之后就是从三个数中再挑两个进行运算,如此如此。
跑了15ms.
#include <stdio.h>
#define eps 1e-8
struct node
{
double a[4];
int len;
}mathe;
int sig(double a)
{
return (a>eps)-(a<-eps);
}
void out(struct node n)
{
int i;
for(i=0;i<n.len;i++)
printf("**%lf\n",n.a[i]);
printf("\n");
}
int can(struct node m)
{
if(m.len==1)
{
if(sig(m.a[0]-24)==0) return 1;
return 0;
}
int i,j,k;
for(i=0;i<m.len;i++)
{
for(j=0;j<m.len;j++)
{
struct node n;
// int top=0;
n.len=0;
if(i!=j)
{
for(k=0;k<m.len;k++)
{
if(k!=i&&k!=j) {n.a[n.len++]=m.a[k];}
}
// n.len+=1;
// out(n);
int tmp=n.len;
n.len+=1;
n.a[tmp]=m.a[i]*m.a[j];
if(can(n)) return 1;
n.a[tmp]=m.a[i]+m.a[j];
if(can(n)) return 1;
n.a[tmp]=m.a[i]-m.a[j];
if(can(n)) return 1;
if(sig(m.a[j]))
{
n.a[tmp]=m.a[i]/m.a[j];
if(can(n)) return 1;
}
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
//int a[4];
scanf("%lf%lf%lf%lf",&mathe.a[0],&mathe.a[1],&mathe.a[2],&mathe.a[3]);
mathe.len=4;
if(can(mathe)) printf("YES\n");
else printf("NO\n");
}
return 0;
}