1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution {
public static int countArrangement(int n) { int []selected = new int[n]; int ls = 0;
int []candidates = new int[n]; for (int i = 0; i < n; i++) { candidates[i] = i + 1; }
Result result = new Result();
backtrace(1, result, selected, ls, candidates, n); return result.count; }
public static void backtrace(int index, Result result, int[] selected, int ls, int[] candidates, int lc) { if (ls == selected.length) { result.count += 1; return; } for (int i = 0; i < lc; i++) { if (isNotPerfect(index, candidates[i])) { continue; }
selected[ls] = candidates[i]; swap(candidates, i, lc - 1);
backtrace(index + 1, result, selected, ls + 1, candidates, lc - 1);
swap(candidates, i, lc - 1); } }
private static void swap(int[] candidates, int i, int j) { int tmp = candidates[j]; candidates[j] = candidates[i]; candidates[i] = tmp; }
static boolean isNotPerfect(int i, int n) { return i % n != 0 && n % i != 0; }
public static class Result { public int count = 0; } }
|