白俊:NとM

6605 ワード

質問する

  • https://www.acmicpc.net/problem/15649
  • リバーストレース
  • 説明:

  • 1からNまでのカードの中からM個を選択した場合、個数を求める!
  • ただし、手順に注意
  • すなわち1 44 1は異なる
  • と見なされる.

    アルゴリズム#アルゴリズム#

  • n_array,used_n宣言
  • 最初の変数はベクトル[長さ=M]
  • 2番目の変数はベクトル[長さ=N]
  • 이 수를 방문 했는가?開始[depth初期値=0]
  • もしdfs(depth)
  • n array出力して
  • に戻る
  • でなければ
  • depth == M繰り返し文を実行
  • 探訪しなくてもいいなら
  • この数字にアクセスしたことを示すi = 0; i < n; i++実行
  • 運行後に「訪問」がないことを示す[なぜ:順序があるから!]
  • コード#コード#

    #include <vector>
    #include <cstdio>
    
    using namespace std;
    
    vector<bool> used_n;
    vector<int> n_array;
    
    int n, depth;
    
    void dfs(int cur_depth) {
        if (cur_depth == depth) {
            for (int tmp : n_array) {
                printf("%d ", tmp);
            }
            printf("\n");
            return;
        }
    
        for (int i = 0; i < n; i++) {
            if (!used_n[i]) {
                used_n[i] = true;
                n_array[cur_depth] = i+1;
                dfs(cur_depth + 1);
                used_n[i] = false;
            }
        }
    }
    
    int main(void) {
        scanf("%d %d", &n, &depth);
    
        // Resize Used
        used_n.resize(n, false);
    
        // Init Vector
        n_array.resize(depth, 0);
    
        dfs(0);
        return 0;
    }