给出4个数进行+-*/四则运算,判断能否组合为24,每个数只能使用一次。输出只需要判断出能否组成24即可。
自己依旧没能独立写出来orz,先放上思路来源:http://www.cnblogs.com/konjak/p/5883283.html
方法是穷举法,把4个数以任意组合进行4则运算,由于是将所有数都进行排列组合两两运算,所以不需要考虑括号(括号的情况已经包含在内)。
每次运算都将结果保存在pai[i]牌,在一次循环完后需要将pai[i]牌的数据恢复才能对下一种4个数的组合计算。(这种方法比定义一个sum来保存数据好很多,可以在递归调用时少传一个sum参数)
#include <iostream>
#include <algorithm>
#include <stdlib.h>
using namespace std;
double pai[4];
bool p[4]; //判断是否使用过
bool dfs(int x)
{
int i,j;
double nu1,nu2;
if(x==3){ //4个数都用完后判断是否等于24,使用近似精度防止1/3*3之类的情况
for(i=0;i<4;i++){
if(!p[i]&&abs(pai[i]-24.0)<0.000001) return 1;
}
return 0;
}
for(i=0;i<4;i++){
if(!p[i]) //判断是未使用的牌
for(j=i+1;j<4;j++)
if(!p[j])
{
p[j]=1;
nu1=pai[i];
nu2=pai[j];
pai[i]=nu1+nu2; if(dfs(x+1)) return 1;
pai[i]=nu1-nu2; if(dfs(x+1)) return 1;
pai[i]=nu2-nu1; if(dfs(x+1)) return 1;
pai[i]=nu1*nu2; if(dfs(x+1)) return 1;
if(nu2!=0)
pai[i]=nu1/nu2; if(dfs(x+1)) return 1;
if(nu1!=0)
pai[i]=nu2/nu1; if(dfs(x+1)) return 1; //对所有情况穷举
pai[i]=nu1; //恢复数据,进行后续循环
p[j]=0; //恢复标记
}
}
return 0;
}
int main()
{
while(1){
for(int i=0;i<4;i++)
cin>>pai[i];
memset(p,0,sizeof(p));
if(dfs(0)) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}