자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
DFS와 백트래킹으로 해결
#include <stdio.h>
#include <vector>
using namespace std;
int n,m;
int visit[10]; // 방문 노드 확인
vector<int> v;
void DFS(int cnt){
// 출력
if( cnt == m){
for(int i=0; i<v.size(); i++){
printf("%d ", v[i]);
}
printf("\n");
return ;
}
// 재귀호출을 통한 DFS
else{
for(int i=1; i<=n; i++){
// 중복 방문을 체크
if(visit[i] != true){
// 재귀호출 시 값 설정
visit[i] = true;
cnt++;
v.push_back(i);
DFS(cnt);
// 호출종료 시 값 해제
visit[i] = false;
cnt--;
v.pop_back();
}
}
}
}
int main(void){
int cnt = 0;
scanf("%d %d", &n, &m);
DFS(cnt);
return 0;
}
재귀함수는 코드는 간단해보이지만 정리하지 않고 작성하면 무한호출에 빠지게 된다. 계획한대로 한 스텝씩 작성하고, 탈출조건을 정확하게 정의한다.
상태공간트리와 백트래킹을 이용하면 쉽게 이해 가능
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
유망함수를 수정하여 탐색횟를 줄인다.
#include <stdio.h>
#include <vector>
using namespace std;
int n,m;
int visit[10]; // 방문 노드 확인
void DFS(int cnt, int max){
// 출력
if( cnt == m){
for(int i=0; i<v.size(); i++){
printf("%d ", v[i]);
}
printf("\n");
return ;
}
// 재귀호출을 통한 DFS
else{
for(int i=1; i<=n; i++){
// 중복 방문을 체크 && 오름차순 방문 체크
if(visit[i] != true && i > max){
// 재귀호출 시 값 설정
visit[i] = true;
cnt++;
v.push_back(i);
max = i;
DFS(cnt, max);
// 호출종료 시 값 해제
visit[i] = false;
cnt--;
v.pop_back();
}
}
}
}
int main(void){
int cnt = 0;
int max = 0; // 오름차순을 위한 변수 최대값 변수
scanf("%d %d", &n, &m);
DFS(cnt, max);
return 0;
}
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
DFS와 백트래킹으로 해결
#include <stdio.h>
#include <vector>
using namespace std;
int n,m;
int visit[10]; // 방문 노드 확인
vector<int> v;
void DFS(int cnt){
// 출력
if( cnt == m){
for(int i=0; i<v.size(); i++){
printf("%d ", v[i]);
}
printf("\n");
return ;
}
// 재귀호출을 통한 DFS
else{
for(int i=1; i<=n; i++){
// 재귀호출 시 값 설정
visit[i] = true;
cnt++;
v.push_back(i);
DFS(cnt);
// 호출종료 시 값 해제
visit[i] = false;
cnt--;
v.pop_back();
}
}
}
int main(void){
int cnt = 0;
scanf("%d %d", &n, &m);
DFS(cnt);
return 0;
}
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
DFS와 백트래킹으로 해결
4-1. 비내림차순 조건을 추가
#include <stdio.h>
#include <vector>
using namespace std;
int n,m;
vector<int> v;
void DFS(int cnt, int max){
// 출력
if( cnt == m){
for(int i=0; i<v.size(); i++){
printf("%d ", v[i]);
}
printf("\n");
return ;
}
// 재귀호출을 통한 DFS
else{
for(int i=1; i<=n; i++){
// 비내림차순 체크
if(i >= max){
// 재귀호출 시 값 설정
cnt++;
v.push_back(i);
max = i;
DFS(cnt, max);
// 호출종료 시 값 해제
cnt--;
v.pop_back();
}
}
}
}
int main(void){
int cnt = 0;
int max = 0;
scanf("%d %d", &n, &m);
DFS(cnt, max);
return 0;
}