package class_2022_02_2_week; // 测试链接 : https://leetcode.com/problems/24-game/ public class Code01_24Game { public static boolean judgePoint24(int[] cards) { if (cards == null || cards.length == 0) { return false; } int n = cards.length; Number[] arr = new Number[n]; for (int i = 0; i < n; i++) { arr[i] = new Number(cards[i], 1); } return judge(arr, cards.length); } // arr中,有效的范围arr[0...size-1] ... 再往右,都无效了,不用看了! public static boolean judge(Number[] arr, int size) { if (size == 1) { return arr[0].numerator == 24 && arr[0].denominator == 1; } for (int i = 0; i < size; i++) { for (int j = i + 1; j < size; j++) { Number inum = arr[i]; Number jnum = arr[j]; arr[j] = arr[size - 1]; arr[i] = add(inum, jnum); if (judge(arr, size - 1)) { return true; } arr[i] = minus(inum, jnum); if (judge(arr, size - 1)) { return true; } arr[i] = minus(jnum, inum); if (judge(arr, size - 1)) { return true; } arr[i] = multiply(inum, jnum); if (judge(arr, size - 1)) { return true; } arr[i] = divide(inum, jnum); if (arr[i] != null && judge(arr, size - 1)) { return true; } arr[i] = divide(jnum, inum); if (arr[i] != null && judge(arr, size - 1)) { return true; } arr[i] = inum; arr[j] = jnum; } } return false; } public static class Number { public int numerator; public int denominator; public Number(int n, int d) { numerator = n; denominator = d; } } public static Number add(Number a, Number b) { return simple(a.numerator * b.denominator + b.numerator * a.denominator, a.denominator * b.denominator); } public static Number minus(Number a, Number b) { return simple(a.numerator * b.denominator - b.numerator * a.denominator, a.denominator * b.denominator); } public static Number multiply(Number a, Number b) { return simple(a.numerator * b.numerator, a.denominator * b.denominator); } public static Number divide(Number a, Number b) { return b.numerator == 0 ? null : simple(a.numerator * b.denominator, a.denominator * b.numerator); } public static Number simple(int up, int down) { if (up == 0) { return new Number(0, 1); } int gcd = Math.abs(gcd(up, down)); return new Number(up / gcd, down / gcd); } public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } }