題目:輸入一個含有8個數(shù)字的數(shù)組蹦疑,判斷有沒有可能把這8個數(shù)字分別放在正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和都相等萨驶。
解法:和全排列思路一樣歉摧,只是最后多加一個判斷條件:先確定第一個數(shù)字,然后對后面的數(shù)字做全排列腔呜。當(dāng)所有數(shù)字都確定下來后叁温,判斷當(dāng)前數(shù)組是否滿足條件正方體上三組相對的面上的4個頂點的和都相等
,即
(nums[0] + nums[1] + nums[2] + nums[3] == nums[5] + nums[6] + nums[7] + nums[4]) && (nums[0] + nums[2] + nums[4] + nums[6] == nums[5] + nums[1] + nums[7] + nums[3]) && (nums[0] + nums[1] + nums[4] + nums[5] == nums[2] + nums[6] + nums[7] + nums[3])
private List<List<Integer>> Permutation(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums == null || nums.length != 8) return result;
permutation(result, nums, 0);
return result;
}
private void permutation(List<List<Integer>> result, int[] nums, int index) {
if (index >= nums.length) {
if ((nums[0] + nums[1] + nums[2] + nums[3] == nums[5] + nums[6] + nums[7] + nums[4]) &&
(nums[0] + nums[2] + nums[4] + nums[6] == nums[5] + nums[1] + nums[7] + nums[3]) &&
(nums[0] + nums[1] + nums[4] + nums[5] == nums[2] + nums[6] + nums[7] + nums[3])) {
List<Integer> numbers = new ArrayList<>();
for (int num : nums) {
numbers.add(num);
}
result.add(numbers);
}
} else {
for (int i = index; i < nums.length; ++i) {
if (i == index || nums[i] != nums[index]) {
int temp = nums[i];
nums[i] = nums[index];
nums[index] = temp;
permutation(result, nums, index + 1);
temp = nums[i];
nums[i] = nums[index];
nums[index] = temp;
}
}
}
}