思路
- 数组全排列,然后进行剪枝
- 剪枝是符合条件的才能继续迭代,全排列中
start
后的每个a[i]
都可以和当前a[start]
交换,因为start
之前的都已经和start
换过了,但是在剪枝中,只有当前的a[i]
满足start%a[i]==0||a[i]%start==0
时,a[i]
才能换到a[start]
的位置上,只要符合一个条件就能交换,不需要管另外一个
backtrack公式
void backtrack(路径,选择列表)
{
if(满足条件){
result.add(路径)||result++;
return;
}
for(选择in选择列表){
//if(条件满足)
做选择;
backtrack(路径,选择列表);
撤销选择;
}
}
代码
#include<stdio.h>
void swap(int *a,int i,int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void swapnums(int *a,int start,int end, int *count){
if(start== end){
(*count)++;
return;
}
int i;
for(i=start;i<end;i++){
if(start%a[i]==0||a[i]%start==0){
swap(a,i,start);
swapnums(a,start+1,end,count);
swap(a,i,start);
}
}
}
int countArrangement(int n){
int nums[n+1];
int i;
for(i=0;i<=n;i++)
nums[i] = i;
int count=0;
swapnums(nums,1,n+1,&count);
return count;
}
int main(){
int re = countArrangement(6);
printf("re = %d\n",re);
}