본문 바로가기
CS

백트래킹

by ddanss 2023. 2. 21.
728x90

가능한 모든 경우의 수를 다 수행해보는 것

브루트포스와 다른 점은

특정 조건에 해당하는 경우에만 탐색을 진행

대표적인 문제 15649 : N과M(1)

int n, m;
int arr[10];
bool isused[10];

void func(int k) { //현재까지 k개의 수를 선택함
	if (k == 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 (!isused[i]) { //아직 i가 사용되지 않았으면
			arr[k] = i; //k번째에 i를 넣어주고
			isused[i] = 1; //i를 사용했다고 남겨주고
			func(k + 1); //다음 수를 정하러 재귀를 한차례 더 들어감
			isused[i] = 0; //k번째수를 i로 정한 모든 경우에 대해 다 확인했으니 i를 다시 사용하지 않았다고 표시해줌
		}
	}
}
int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	func(0);
}

https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x0C/15649.cpp

반응형

'CS' 카테고리의 다른 글

다익스트라 c++  (1) 2023.04.03
플로이드 와샬  (0) 2023.03.02
투포인터  (0) 2023.02.22
퀵정렬, 합병정렬, 힙정렬  (0) 2023.02.17
버블정렬, 선택정렬, 삽입정렬  (0) 2023.02.17

댓글