백트래킹?
--> 현재 상태에서 가능한 모든 후보군을 따라 들어가며 탐색하는 알고리즘
void funcRecursive(int depth, int n, int m) // 현재 depth개까지 수를 선택
{
if (depth == m) // m개를 모두 선택했다면
{
for (int i = 0; i < m; i++)
{
cout << arr[i] << ' ';
}
cout << '\n';
return;
}
for (int i = 1; i <= n; i++) // 1부터 n까지의 수에대해
{
if (bUsed[i] == false) // 아직 i가 사용되지 않았다면
{
arr[depth] = i; // depth번째 수를 i로 정한다
bUsed[i] = true; // i는 사용했다고 명시
funcRecursive(depth + 1, n, m); // 다음 수를 정하러 한 단계 더 들어간다
bUsed[i] = false; // depth번째 수를 i로 정한 모든 경우에 대해 다 확인하면 i를 다시 미사용으로
}
}
}
** N과 M 시리즈의 문제 중에서 1,2,5,6번은 next_permutation을 써서 다시 한번 풀어볼 것
3,4,7,8 같은 문제들은 같은 수를 여러 번 쓸 수 있기때문에 사용하기가 어렵다 **
# n개의 수에서 m개를 선택할 때
vector<int> v(n);
for (int i = m; i < n; i++)
{
v[i] = 1;
}
do
{
for (int i = 0; i < n; i++)
{
if (v[i] == 0)
{
// ~~
}
}
} while (next_permutation(v.begin(), v.end()));
vector<int> v;
for (int i = 0; i < n; i++)
{
v.push_back(i < m ? 0 : 1);
}
do
{
for (int i = 0; i < n; i++)
{
if (v[i] == 0)
{
// ~~
}
}
} while (next_permutation(v.begin(), v.end()));
bool bMask[n] = {};
fill(bMask + m, bMask + n, true);
do
{
for (int i = 0; i < n; i++)
{
if (!bMask[i])
{
// ~~
}
}
} while (next_permutation(bMask, bMask + n));
// int arr[n] = {1, 2, 3, ~ ,n};
do
{
reverse(arr + m, arr + n);
for (int i = 0; i < m; i++)
{
cout << arr[i];
}
} while (next_permutation(arr, arr + n));
# 출처
'Algorithm > 정리' 카테고리의 다른 글
0x0E,0F - 정렬 (0) | 2022.02.28 |
---|---|
0x02 - 기초 코드 작성 요령2 (0) | 2022.02.15 |
cpp (0) | 2022.02.10 |
0x0B - 재귀 (0) | 2022.01.25 |
0x01 - 기초 코드 작성 요령1 (0) | 2022.01.25 |