[伯俊C+]15649NとM(1)


質問リンク

質問する


自然数NとMが与えられた場合、以下の条件を満たすすべての長さMの数列を解くプログラムを作成します.
  • 1からNまで、自然水体中でM個の数列
  • を繰り返し選択する.

    入力


    第1行は自然数NとMを与える.(1 ≤ M ≤ N ≤ 8)

    しゅつりょく


    各行に問題条件を満たす数列を出力します.重複する数列は複数回出力できません.各数列はスペースで区切らなければなりません.
    数列は予め増加した順序で出力しなければならない.

    入力/出力例

    // 예제 입력 1
    3 1
    // 예제 출력 1
    1
    2
    3
    // 예제 입력 2
    4 2
    // 예제 출력 2
    1 2
    1 3
    1 4
    2 1
    2 3
    2 4
    3 1
    3 2
    3 4
    4 1
    4 2
    4 3
    // 예제 입력 3
    4 4
    // 예제 출력 3
    1 2 3 4
    1 2 4 3
    1 3 2 4
    1 3 4 2
    1 4 2 3
    1 4 3 2
    2 1 3 4
    2 1 4 3
    2 3 1 4
    2 3 4 1
    2 4 1 3
    2 4 3 1
    3 1 2 4
    3 1 4 2
    3 2 1 4
    3 2 4 1
    3 4 1 2
    3 4 2 1
    4 1 2 3
    4 1 3 2
    4 2 1 3
    4 2 3 1
    4 3 1 2
    4 3 2 1
    アルゴリズム#アルゴリズム#
    dfsアルゴリズムを使用してソートします.
    #include <iostream>
    #include <vector>
    using namespace std;
    
    bool sel[8];
    int num[8] = {1, 2, 3, 4, 5, 6, 7, 8};
    int N, M;
    vector<int> vec;
    
    void PrintVec() {
    
      for (int i = 0; i < vec.size(); i++)
      {
       cout << vec[i] << " ";
      }
    
      cout << "\n";
    }
    
    void dfs(int cnt) {
    
      if (cnt == M)
      {
        PrintVec();
        return;
      }
    
      for (int i = 0; i < N; i++) {
        if (sel[i] == true) continue;
    
        sel[i] = true;
        vec.push_back(num[i]);
        dfs(cnt + 1);
        vec.pop_back();
        sel[i] = false;
      }
    }
    
    int main() {
      
      cin >> N >> M;
    
      dfs(0);
    
    }