https://www.acmicpc.net/problem/15649
15649번: N과 M (1)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
www.acmicpc.net
배운점 :
1. BackTracking 문제는 깊어진 depth 에서 다시 빠져나올 때도 생각해야한다.

2. 중복검사는 visited[i]로 하는게 빠르다. ( 다이나믹 프로그래밍) for문으로 일일이 중복되는지 확인하지 말자.
3. 코딩하면서 변수가 코드로써 뭘 의미하는지도 적어놓고 하면 생각이 편하다.
ex) depth는 tree의 깊이(개념)이자 arr의 인덱스 역할(코드로써의 의미)로 썼다.
i는 해당 depth에서 넣을 number의 의미로 사용됐다.
#include <iostream>
using namespace std;
#define MAX 9
int visited[MAX];
int arr[MAX];
int N, M;
//int cnt;
void DFS(int depth)
{
if (depth >= M) // finish condition
{
for (int i = 0; i < M; i++)
{
cout << arr[i] << " ";
}
cout << "\n";
//cnt++;
return;
}
// NOT finish condition
else
{
for (int i = 1; i <= N; i++) // i : number, depth : index
{
if (!visited[i])
{
visited[i] = 1;
arr[depth] = i;
DFS(depth + 1);
visited[i] = 0;
arr[depth] = 0;
}
}
}
}
int main()
{
cin >> N >> M;
DFS(0);
//cout << cnt;
return 0;
}
'Programming > 알고리즘' 카테고리의 다른 글
| [백준 A/B] double 출력 자릿수 문제 (0) | 2020.03.03 |
|---|---|
| [백준 알파벳] DFS, BackTracking 문제 (0) | 2020.03.01 |
| 백준 토마토문제 (0) | 2020.02.11 |
| 백준 구슬탈출2 (0) | 2020.02.11 |
| 백준 나무자르기 (0) | 2020.02.11 |