回溯
dfs(1);安排值为1的位置,可以是小标1 ~ n,n中情况for (var i = 1; i <= n; i++) {下标 从1到nif (!arr[i]) {默认情况下arr[i]为falseif (x % i == 0 || i % x == 0) {如果满足完美要求,则设置i位置为已经处理,用arr[i]记录下状态,然后进一步探索- 当选择好了
dfs(1)后,于是确定了一个下标,然后在arr[i]中做好笔记,然后进一步安排dfs(2),从剩下的空位中找一个坑,然后标记他的位置,。。。。。直到把最后一个安排好了就记录一次结果res++,处理好了余下的情况,就回溯,将状态恢复一下arr[i] = false;
var countArrangement = function (n) {
var res = 0;
var arr = new Array(n + 1).fill(false)
dfs(1);
return res;
function dfs(x) {
if (x > n) return res++;
for (var i = 1; i <= n; i++) {
if (!arr[i]) {
if (x % i == 0 || i % x == 0) {
arr[i] = true;
dfs(x + 1)
arr[i] = false;
}
}
}
}
};