CS/알고리즘
백트래킹(Backtracking)
lms0806
2023. 1. 25. 12:36
728x90
반응형
백트래킹(Backtracking)은 답을 찾아가는 도중, 정답이 아닐거 같으면 뒤로 돌아가서 다시 답을 찾아가는 과정을 통해 해답을 구하는 방식의 알고리즘입니다. DFS을 알고 있다면, 이해하기 쉽습니다.
<DFS와 백트래킹의 차이점>
DFS : 1번 방문한 곳은 다시 방문하지 못한다.
백트래킹 : 1군데를 여러번 방문할 수 있다.
ex)
https://www.acmicpc.net/problem/15649
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] arr;
static boolean[] visited;
static int n, m;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[m]; //최대 m개의 개수
visited = new boolean[n]; //n개의 노드들
dfs(0);
System.out.print(sb);
}
public static void dfs(int depth) {
if(m == depth) { //깊이가 m개가 될 경우
for(int a : arr) {
sb.append(a).append(" ");
}
sb.append("\n");
return;
}
for(int i = 0; i < n; i++) {
if(!visited[i]) { //방문하지 않은 경우
visited[i] = true;
arr[depth] = i + 1;
dfs(depth + 1);
visited[i] = false; //정답이 아니므로 다시 방문할 수 있도록 체크 해제
}
}
}
}
추천 문제
https://www.acmicpc.net/problem/2992
https://www.acmicpc.net/problem/14888
728x90
반응형