/*
* 算法思想:
* 回溯算法+剪枝。
*
*/
bool check(int *arr, int len){
int i;
for(i=0; i<len; i++){
if(((i+1)%arr[i] != 0 && arr[i]%(i+1)!=0)) return false;
}
return true;
}
void swap(int *a, int *b){
int c = *a;
*a = *b;
*b = c;
}
void print(int *arr, int l){
int i;
for(i=0; i<l; i++)
printf("%d,", arr[i]);
printf("\n");
}
void get(int *arr, int len, int index, int *cnt){
if(index>len) return;
if(!check(arr, index)) return;
if(index == len){
// print(arr,len);
if(check(arr, len)){
(*cnt)++;
}
return;
}
int i;
for(i=index; i<len; i++){
swap(&arr[index], &arr[i]);
get(arr, len, index+1, cnt);
swap(&arr[index], &arr[i]);
}
}
int countArrangement(int N){
int arr[N], i, j;
int ret = 0;
for(i=0; i<N; i++){
arr[i] = i+1;
}
get(arr, N, 0, &ret);
return ret;
}
leetcode-526-优美的排列 -C语言
最新推荐文章于 2024-02-26 09:39:39 发布