题目出处:https://leetcode-cn.com/problems/beautiful-arrangement/
思路1:深度优先遍历枚举每个可能的结果,统计结果总数
- 递归函数 void dfs(int pos,int &n,vector<bool>& vis):表示对于第pos位可能填充的数字有多少个,显然它受限与vis数组(在没访问过的数中选取)。
- 递归终止条件 pos == n+1:说明此时数组第n个位置的数已经分配完毕,说明找到一个可行解。
- 遍历完所有的可能结果后,返回ans即可。
class Solution {
private:
int ans = 0;
public:
void dfs(int pos, int &n, vector<bool>& vis){
if(pos == n+1){
++ans;
return;
}
for(int i = 1; i <= n; ++i){ //遍历每种可能数
if(!vis[i] && ( i % pos == 0 || pos % i == 0 )){
vis[i] = true;
dfs(pos+1, n, vis);
vis[i] = false;
}
}
}
int countArrangement(int n) {
int pos = 1;
vector<bool> vis(n+1, false);
dfs(pos, n, vis);
return ans;
}
};