トピック:
1からNまでのN個の整数があるとします。これらのN個の数値から配列が正常に構築され、配列のi番目のビット(1 <= i <= N)が次の2つの条件のいずれかを満たす場合、次のように呼び出します。この配列は美しい配置です。調子:
- i番目の数はiで割り切れる
- i番目の数で割り切れる
整数Nが与えられた場合、いくつの美しい順列を構築できますか?
例1:
入力:2
出力:2
説明:
最初の美しい配置は[1、2]です。
最初の位置(i = 1)の数は1であり、1はi(i = 1)で割り切れます
。2番目の位置(i = 2)の数は2です。 、2はiで割り切れる(i = 2)
2番目の美しい配置は[2、1]です。
最初の位置(i = 1)の数は2で、2はi(i = 1)で割り切れます
。2番目の位置(i = 2)の数は1です。 i(i = 2)は1で割り切れる可能性があります。
説明:
- Nは正の整数であり、15を超えることはありません。
ソース:
問題解決のアイデア:バックトラック
使用される配列を定義します。used[i]は、番号iが使用されたことを示し、再帰的+適格な番号へのバックトラックを示します。
- 再帰的終了条件:番号はすべての位置に配置されています
- 可能な番号セット:N個の番号から未使用の番号を選択し、適切な条件を満たす
class Solution {
public:
int result;
int countArrangement(int n) {
result = 0;
vector<bool> used(n+1, false);
back(n, 0, used);
return result;
}
void back(int n, int start, vector<bool>& used) {
if (start == n) {
result++;
return;
}
for (int i = 1; i <= n; i++) {
if (used[i]) continue;
if (i % (start+1) == 0 || (start+1) % i == 0) {
used[i] = true;
back(n, start+1, used);
used[i] = false;
}
}
}
};