此题通过回溯的方法进行求解,即递归调用只要有一个数字符合将此数字标记,以此类推,只要能调用到最后一个数字,那么就可以有一个序列成立,结果加一。
代码如下:
void back(int &result,int flag[],vector<int> num,int k){
if(k == num.size()){
result++;
}else{
for(int i = 0;i < num.size();i++){
if(flag[i] != 1 && (num[i] % (k + 1) == 0 || (k + 1) % num[i] == 0)){
flag[i] = 1;
k++;
back(result,flag,num,k);
k--;
flag[i] = 0;
}
}
}
}
int countArrangement(int n) {
vector<int> num;
for(int i = 0;i < n;i++){
num.push_back(i + 1);
}
int flag[20],k = 0;
memset(flag,0,20);
int result = 0;
for(int i = 0;i < n;i++){
flag[i] = 1;
k++;
back(result,flag,num,k);
k--;
flag[i] = 0;
}
return result;
}