链接:LeetCode679
过程:以前做过,快忘记了,枚举所有可能的情况,判断一下就行
思路:用回溯来枚举状态
代码:
class Solution {
public boolean judgePoint24(int[] nums) {
int[] hh=new int[4];
for(int i=0;i<4;i++)hh[i]=1;
return dfs(nums,hh);
}
boolean dfs(int[] a,int[] b){
int n=a.length;
if(n==1){
if(a[0]%b[0]==0&&a[0]/b[0]==24)return true;
return false;
}
int[] ha=new int[n-1];
int[] hb=new int[n-1];
int cnt;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
cnt=0;
for(int k=0;k<n;k++){
if(k!=i&&k!=j){
ha[cnt]=a[k];
hb[cnt]=b[k];
cnt++;
}
}
ha[cnt] = a[i] * b[j] + a[j] * b[i];
hb[cnt] = b[i] * b[j];
if (hb[cnt]!=0&&dfs(ha, hb)) return true;
ha[cnt] = a[i] * b[j] - a[j] * b[i];
hb[cnt] = b[i] * b[j];
if (hb[cnt]!=0&&dfs(ha, hb)) return true;
ha[cnt] = a[j] * b[i] - a[i] * b[j];
hb[cnt] = b[i] * b[j];
if (hb[cnt]!=0&&dfs(ha, hb)) return true;
ha[cnt] = a[i] * a[j];
hb[cnt] = b[i] * b[j];
if (hb[cnt]!=0&&dfs(ha, hb)) return true;
ha[cnt] = a[i] * b[j];
hb[cnt] = b[i] * a[j];
if (hb[cnt] != 0 && dfs(ha, hb)) return true;
ha[cnt] = a[j] * b[i];
hb[cnt] = b[j] * a[i];
if (hb[cnt] != 0 && dfs(ha, hb)) return true;
}
}
return false;
}
}