[バックトラック] [leetcode]美しいアレンジ

トピック:

1からNまでのN個の整数があるとします。これらのN個の数値から配列が正常に構築され、配列のi番目のビット(1 <= i <= N)が次の2つの条件のいずれかを満たす場合、次のように呼び出します。この配列は美しい配置です。調子:

  1. i番目の数はiで割り切れる
  2. 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を超えることはありません。

ソース:

526.美しいアレンジ

問題解決のアイデア:バックトラック

使用される配列を定義します。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;
            }
        }
    }
};

 

おすすめ

転載: blog.csdn.net/hbuxiaoshe/article/details/115186818