https://www.acmicpc.net/problem/15650
15650번: N과 M (2)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
백트래킹 알고리즘을 이용해 해결할 수 있다. 조건에 따라 수를 하나씩 선택해 arr에 넣어주고 출력한다.
#include <bits/stdc++.h>
using namespace std;
int n,m;
int arr[10]; //수열 저장
bool used[10]; //수의 사용 여부 저장
void func(int k){ //k는 선택한 수의 개수
if(k==m){ //m개만큼 수를 선택==arr에 삽입 했다면 출력 후 함수 종료
for(int i=0;i<m;i++){
cout<<arr[i]<<" ";
}
cout<<"\n";
return;
}
for(int i=1;i<=n;i++){
if(used[i]) continue; //이미 사용된 수 제외함
if(k!=0&&arr[k-1]>=i) continue; //오름차순 정렬, 이전에 선택한 수보다 작은 값은 제외함
arr[k]=i; used[i]=1;
func(k+1); //
used[i]=0;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin>>n>>m;
func(0);
return 0;
}
'ALG > ALG Solve' 카테고리의 다른 글
C++) 백준1149번 - RGB거리 (0) | 2023.02.06 |
---|---|
C++) 백준 6603번 - 로또 (0) | 2023.01.29 |
C++) 백준 1992번 - 쿼드트리 (0) | 2023.01.27 |
C++) 백준 - 17478번 재귀함수가 뭔가요? (0) | 2023.01.25 |
C++) 백준 7562번 - 나이트의 이동 (0) | 2023.01.23 |