poj2787 算24

每次枚举两个数,一个运算符,得到一个运算结果。在重复执行,直到只剩下一个数即可。

#include <iostream>
#include <cmath>
using namespace std;
int ans=0;
void dfs(double a[],int n)
{
	int i,j,x,y,k,m;double b[4];
	if(n==1&&a[0]>0&&fabs(a[0]-24)<0.0001) ans=1;
	else if(n>1)
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(i==j) continue;
			for(m=k=0;k<n;k++)
			if(k!=i&&k!=j) { b[m]=a[k]; m++;}
			b[m]=a[i]+a[j];  dfs(b,m+1);
			b[m]=a[i]-a[j];  dfs(b,m+1);
			b[m]=a[i]*a[j];  dfs(b,m+1);
			if(a[j]!=0)b[m]=a[i]/a[j];  dfs(b,m+1);
		}
	}
}
int main(int argc, char *argv[])
{
	double a[4];
	//freopen("24.txt","w",stdout);
	while(cin>>a[0]>>a[1]>>a[2]>>a[3]&&(a[0]+a[1]+a[2]+a[3])!=0)
	{
		ans=0; dfs(a,4); 
		if(ans) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}


 

 

posted on 2013-09-26 21:28  you Richer  阅读(462)  评论(0编辑  收藏  举报