백트래킹 - KimTaebin-ai/study_posts GitHub Wiki
현재 상태에서 가능한 모든 후보군을 따라 들어가며 탐색하는 알고리즘
https://www.acmicpc.net/problem/15649
#include <stdio.h>
int N, M;
int arr[10];
int isUsed[10];
void func(int k) {
if (k == M) {
for (int i = 0; i < M; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return ;
}
for (int i = 1; i <= N; i++) {
if (!isUsed[i]) {
arr[k] = i;
isUsed[i] = 1;
func(k + 1);
isUsed[i] = 0;
}
}
}
int main() {
scanf("%d %d", &N, &M);
func(0);
}
https://www.acmicpc.net/problem/9663
#include <stdio.h>
int isUsed1[40];
int isUsed2[40];
int isUsed3[40];
int cnt = 0;
int n;
void func(int cur) {
if (cur == n) {
cnt++;
return;
}
for (int i = 0; i < n; i++) {
if (isUsed1[i] || isUsed2[i + cur] || isUsed3[cur - i + n - 1])
continue;
isUsed1[i] = 1;
isUsed2[i+cur] = 1;
isUsed3[cur - i + n - 1] = 1;
func(cur + 1);
isUsed1[i] = 0;
isUsed2[i+cur] = 0;
isUsed3[cur - i + n - 1] = 0;
}
}
int main() {
scanf("%d", &n);
func(0);
printf("%d\n", cnt);
}