#BOJ 15654 NおよびM(5)


NとM(5)
( https://www.acmicpc.net/problem/15654 )
시간 제한	메모리 제한	제출	정답	맞힌 사람	정답 비율
1 초	512 MB	14605	10679	8519	72.930%
質問する
N個の自然数とM個の自然数が与えられた場合、以下の条件を満たす長さMのすべての数列を求めるプログラムを作成します.N個の自然数はいずれも異なる数である.
N個の自然数の中からM個の数列を選択
入力
1行目はNとMです.(1 ≤ M ≤ N ≤ 8)
2行目にはN個の数字があります.10,000以下の自然数を入力します.
しゅつりょく
各行に問題条件を満たす数列を出力します.重複する数列は複数回出力できません.各数列はスペースで区切らなければなりません.
数列は予め増加した順序で出力しなければならない.
入力例1
3 1
4 5 2
サンプル出力1
2
4
5
入力例2
4 2
9 8 7 1
サンプル出力2
1 7
1 8
1 9
7 1
7 8
7 9
8 1
8 7
8 9
9 1
9 7
9 8
入力例3
4 4
1231 1232 1233 1234
サンプル出力3
1231 1232 1233 1234
1231 1232 1234 1233
1231 1233 1232 1234
1231 1233 1234 1232
1231 1234 1232 1233
1231 1234 1233 1232
1232 1231 1233 1234
1232 1231 1234 1233
1232 1233 1231 1234
1232 1233 1234 1231
1232 1234 1231 1233
1232 1234 1233 1231
1233 1231 1232 1234
1233 1231 1234 1232
1233 1232 1231 1234
1233 1232 1234 1231
1233 1234 1231 1232
1233 1234 1232 1231
1234 1231 1232 1233
1234 1231 1233 1232
1234 1232 1231 1233
1234 1232 1233 1231
1234 1233 1231 1232
1234 1233 1232 1231
インプリメンテーション
/*
BOJ : https://www.acmicpc.net/problem/15654
backtracking N과 M(5)
Versatile0010
*/

#include <bits/stdc++.h>
using namespace std;

int n, m; // N 개의 자연수 중에서 M 개를 고른 수열
int arr[10];
vector<int> input_arr;
bool isused[10];

void solve(int k)
{
	if (k == m)
	{
		for (int i = 0; i < m; i++)
			cout << arr[i] << ' ';
		cout << '\n';
		return;
	}
	else
	{
		for (int i = 0; i < n; i++)
		{
			if (!isused[i])
			{
				arr[k] = input_arr[i];
				isused[i] = true;
				solve(k + 1);
				isused[i] = false;
			}
		}
	}
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		int temp;
		cin >> temp;
		input_arr.push_back(temp);
	}
	sort(input_arr.begin(), input_arr.end());
	solve(0);
	return 0;
}
GIT : https://github.com/versatile0010/PS/blob/main/Backtracking/BOJ%2015654%20N%EA%B3%BC%20M(5).cpp