參考https://mp.csdn.net/postedit/100632372,先了解下基本的全排序
基於指定的一組排序進行計算時,需要繼續遍歷 + - * /, 其中特別注意減法順序(是否可優化?)及除零問題
#include <math.h>
#include <string.h>
#include <stdio.h>
double pai[4] = {1,5,5,5};
bool visited[4] = {0}; //判斷是否使用過, 初始化默認未使用
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(!visited[i]&&abs(pai[i]-24.0)<0.000001) return 1;
}
return 0;
}
for(i=0;i<4;i++){ // ********** 技巧:全排序
if(!visited[i]) // 判斷是未使用的牌
for(j=i+1;j<4;j++)
if(!visited[j])
{
visited[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; //恢復數據,進行後續循環
visited[j]=0; //恢復標記
}
}
return 0;
}
int main()
{
dfs(0)? printf ("yes") : printf ("no");
return 0;
}