答案:479306
思路:递归暴力搜索出1到10的全排列,在10个数排列完毕后再剔除数组中的相邻元素的元素值相同的情况。
public class Main {
private static int ans;
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4 ,5,6,7,8,9,10};
fullSort(arr, 0, arr.length - 1);
System.out.println(ans);
}
public static void fullSort(int[] arr, int start, int end) {
// 递归终止条件
if (start == end&&istrue(arr)) {
ans++;
return;
}
for (int i = start; i <= end; i++) {
swap(arr, i, start);
fullSort(arr, start + 1, end);
swap(arr, i, start);
}
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
private static boolean istrue(int[] arr) {
// TODO Auto-generated method stub
for (int i = 0; i < arr.length; i++) {
if (i==0&&isfriend(arr[i],arr[i+1])) {
return false;
}
if (i==arr.length-1&&isfriend(arr[i],arr[i-1])) {
return false;
}
if (i>0&&i<arr.length-1&&(isfriend(arr[i],arr[i+1])||isfriend(arr[i],arr[i-1]))) {
return false;
}
}
return true;
}
private static boolean isfriend(int i, int j) {
// TODO Auto-generated method stub
return Math.abs(i-j)==1;
}
}