算24点(DFS)

    xiaoxiao2021-03-25  101

    给出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; }
    转载请注明原文地址: https://ju.6miu.com/read-23686.html

    最新回复(0)