https://www.acmicpc.net/problem/2580
스도쿠가 주어지고 빈칸을 채우는 문제입니다.
일단 스도쿠를 완성하기 위한 조건으로
3*3 구역, 가로, 세로에 모두 다른 숫자가 와야합니다.
우선 빈칸이 0으로 되어있기때문에 ArrayList에 빈칸의 좌표를 모두 넣습니다.
그런 다음 이 빈칸들을 가지고 백트래킹을 돌립니다.
현재 좌표에서 1~9를 모두 넣어보고 조건에 맞으면 다음 좌표로 넘어가는 식으로 계속 탐색해주시면 되겠습니다.
모든 빈칸을 다 채웠을 때 출력해주시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; static char div[][] = { { 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c' }, { 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c' }, { 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c' }, { 'd', 'd', 'd', 'e', 'e', 'e', 'f', 'f', 'f' }, { 'd', 'd', 'd', 'e', 'e', 'e', 'f', 'f', 'f' }, { 'd', 'd', 'd', 'e', 'e', 'e', 'f', 'f', 'f' }, { 'g', 'g', 'g', 'h', 'h', 'h', 'i', 'i', 'i' }, { 'g', 'g', 'g', 'h', 'h', 'h', 'i', 'i', 'i' }, { 'g', 'g', 'g', 'h', 'h', 'h', 'i', 'i', 'i' } }; static boolean cols[][] = new boolean[9][10]; static boolean rows[][] = new boolean[9][10]; static boolean visit[][] = new boolean[9][10]; static int list[][] = new int[9][9]; static ArrayList<int[]> e = new ArrayList<>(); static boolean chk; static void dfs(int idx) { if (idx == e.size()) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { System.out.print(list[i][j] + " "); } System.out.println(); } chk = true; return; } int x = e.get(idx)[0]; int y = e.get(idx)[1]; for (int i = 1; i <= 9; i++) { if (rows[x][i] || cols[y][i] || visit[div[x][y] - 'a'][i]) continue; rows[x][i] = true; cols[y][i] = true; visit[div[x][y] - 'a'][i] = true; list[x][y] = i; dfs(idx + 1); if (chk) return; list[x][y] = 0; rows[x][i] = false; cols[y][i] = false; visit[div[x][y] - 'a'][i] = false; } } static void input() throws Exception { for (int i = 0; i < 9; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < 9; j++) { list[i][j] = Integer.parseInt(st.nextToken()); if (list[i][j] == 0) { e.add(new int[] { i, j }); } else { cols[j][list[i][j]] = true; rows[i][list[i][j]] = true; visit[div[i][j] - 'a'][list[i][j]] = true; } } } } public static void main(String[] args) throws Exception { input(); dfs(0); } } | cs |
'algorithm > dfs' 카테고리의 다른 글
boj 15650 N 과 M (2) (0) | 2021.01.26 |
---|---|
boj 15649 N 과 M (1) (0) | 2021.01.26 |
boj 1759 암호 만들기 (0) | 2021.01.22 |
boj 1062 가르침 (0) | 2021.01.22 |
boj 9663 N-Queen (0) | 2021.01.22 |