티스토리 뷰

Algorithm

백준_스도쿠_2239

Young_J 2020. 11. 2. 12:45

//알고리즘

1. 백트래킹

2. 행, 열, 3x3 을 확인하여 해당자리 에 들어갈 수 있는 숫자 중 가장 적은 숫자부터 넣기 시작함.

3. 값이 첫번째로 다 채워진다면 재귀를 탈출한다(정답이 여러개 나올 수 있음)

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class 스도쿠_2239 {
	static int map[][], copyMap[][];
	static boolean flag = true;
	static boolean[] v = new boolean[10];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		map = new int[9][9];
		copyMap = new int[9][9];

		for (int i = 0; i < 9; i++) {
			String str = br.readLine();
			for (int j = 0; j < 9; j++) {
				copyMap[i][j] = map[i][j] = str.charAt(j) - '0';
			}
		}

		cal(0);
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				System.out.print(map[i][j]);
			}
			System.out.println();

		}

//		print(map);

	}

	private static void cal(int idx) {

		boolean[] v = new boolean[10];
		for (int r = 0; r < 9; r++) {
			for (int c = 0; c < 9; c++) {
				if (copyMap[r][c] != 0) continue;
				checkMap(v, copyMap, r, c);
				for (int k = 1; k <= 9; k++) {
					// 중복값 아닌거
					if (v[k]) continue;
					copyMap[r][c] = k;
					cal(idx + 1);
					if (check(copyMap)) {
						map = copyMap;
						return;
					}
					copyMap[r][c] = 0;
				}
				return;
			}

		}

	}

	private static void checkMap(boolean[] v, int[][] map, int r, int c) {
		// TODO Auto-generated method stub
		// 행
		for (int i = 0; i < 9; i++) {
			v[map[r][i]] = true;
		}
		// 열
		for (int i = 0; i < 9; i++) {
			v[map[i][c]] = true;
		}
		// 3x3
		int a = (r / 3) * 3;
		int b = (c / 3) * 3;

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				v[map[a + i][b + j]] = true;
			}
		}

	}

	private static boolean check(int[][] map) {
		Arrays.fill(v, false);
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				v[map[i][j]] = true;
			}

			for (int j = 1; j <= 9; j++) {
				if (!v[j])
					return false;
			}
			Arrays.fill(v, false);
			for (int j = 0; j < 9; j++) {
				v[map[j][i]] = true;
			}
			for (int j = 1; j <= 9; j++) {
				if (!v[j])
					return false;
			}
		}
		return true;
	}

	private static void print(int[][] map) {
		// TODO Auto-generated method stub
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}

	}

}

'Algorithm' 카테고리의 다른 글

백준_경비원_2564  (0) 2020.11.05
백준_양치기 꿍_3187  (0) 2020.11.03
백준_드래곤커브_15685  (0) 2020.11.01
SW Expert Academy_수영장  (0) 2020.10.31
백준_뱀_3190  (0) 2020.10.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/02   »
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
글 보관함