oj2787 算24
1 #include<math.h> 2 #include<stdio.h> 3 #define Z 1e-6 //因为实数是否为0的判断不能用'==',而取而代之的是判断其是否小于一个很小的数,这里用10^(-6) 4 double a[4];//必须是double型的,我刚开始是用float,结果贡献了几个WA 5 bool f(int n) 6 { 7 if(n==1){//最后处理完毕,即到达解答树叶子节点 8 if(fabs(a[0]-24)<Z) return 1;//假如最后结果==24,则返回1 9 else return 0; 10 } 11 for(int i=0;i<n;++i)//双层循环,用以查找所有的可能情况,即取第i个元素与第j个元素进行运算 12 for(int j=i+1;j<n;++j){//从i+1开始,提高查找效率,但这时要注意下面2个操作数的前后顺序,都要考虑,一次过 13 double x=a[i];//取第i个元素 14 double y=a[j];//取第j个元素 15 a[j]=a[n-1];//最后一个元素前移到j,准备下次递归使用,n要-- 16 a[i]=x+y;//而x+y作为新的第i个元素 17 if(f(n-1)) return 1;//假如碰到一个符合的,即f(n-1)返回1,则不再往下进行,节省时间后面的也是如此 18 a[i]=x-y; 19 if(f(n-1)) return 1; 20 a[i]=y-x; 21 if(f(n-1)) return 1; 22 a[i]=x*y; 23 if(f(n-1)) return 1; 24 if(fabs(y)>Z){//必须注意除数不能为0 25 a[i]=x/y; 26 if(f(n-1)) return 1; 27 } 28 if(fabs(x)>Z){ 29 a[i]=y/x; 30 if(f(n-1)) return 1; 31 } 32 a[i]=x; 33 a[j]=y; 34 } 35 return 0; 36 } 37 int main() 38 { 39 while(scanf("%lf%lf%lf%lf",&a[0],&a[1],&a[2],&a[3]),(int)a[0]){//a[0]==0时,跳出 40 if(f(4)) puts("YES"); 41 else puts("NO"); 42 } 43 return 0; 44 }
//较复杂的递归搜索解答树目标状态!!