24点游戏算法-华为OJ

来源:互联网 发布:淘宝网上买的300元的狗 编辑:程序博客网 时间:2024/05/21 09:15

网上搜了一些答案,发现有些答案在3个数运算等于24后就返回true了,明显不对。

这里还是用全排列忽略掉+-*/的优先顺序,然后对每一个排列进行dfs。

import java.util.*;public class Main {static ArrayList<Integer> list = new ArrayList<>();public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNextInt()) {list.clear();int[] a = new int[4];for (int i = 0; i < 4; i++) {a[i] = sc.nextInt();}permutation(a, 0, 4);//求全排列boolean ok = false;for(int j = 0;j<list.size()/4;j++){int[] b = new int[4];for(int i = 0;i<4;i++){b[i] = list.get(j*4+i);}if(f((double)b[0], b,1)){ok = true;break;}}System.out.println(ok);}}public static boolean f(double result, int[] a, int index) {if (index ==4){return result == 24;}else if(f(result + a[index], a,index+1) || f(result - a[index], a, index+1)|| f(result * a[index], a,index+1)|| (a[index] != 0 && f(result / a[index], a,index+1)))return true;return false;}static void permutation(int[] a,int k,int n){//求全排列if(k==n){for(int i:a)list.add(i);}else{for(int i = k;i<n;i++){//求ABCD的全排列,将ABCD分别和A交换,然后求剩下的数的全排列swap(a,i,k);permutation(a, k+1, n);swap(a,i,k);}}}static void swap(int[] a,int p,int q){int tmp = a[p];a[p] = a[q];a[q] = tmp;}}

0 0