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; }