Coding Test/Baekjoon
백준/2580/Java - 스도쿠
grogu....
2023. 2. 6. 15:23
문제
https://www.acmicpc.net/problem/2580
2580번: 스도쿠
스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
class Zero{
int x;
int y;
Zero(int x, int y){
this.x = x;
this.y = y;
}
}
public class Main {
static int zCount;
static int[][] arr = new int[9][9];
static boolean[] visit = new boolean[26];
static ArrayList<Zero> zList;
static StringBuilder sb = new StringBuilder();
; public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
zList = new ArrayList<>();
for(int i=0; i<9; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<9; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
if(arr[i][j] == 0) zList.add(new Zero(i, j));
}
}
zCount = zList.size();
dfs(0);
}
public static void dfs(int depth) {
if(depth == zCount) {
print();
System.exit(0);
return;
}
int x = zList.get(depth).x;
int y = zList.get(depth).y;
for(int j=1; j<=9; j++) {
arr[x][y] = j;
if(sudoku(x,y)) dfs(depth+1);
arr[x][y] = 0;
}
}
public static boolean sudoku(int x, int y) {
for(int i=0; i<9; i++) {
if(arr[x][i] == arr[x][y] && i != y) {
return false; //세로 체크
}
if(arr[i][y] == arr[x][y] && i != x) {
return false; //가로 체크
}
}
int sx = 0, ex = 0, sy =0, ey = 0;
switch(x%3) {
case 0: sx = x; ex=x+2; break;
case 1: sx = x-1; ex=x+1; break;
case 2: sx = x-2; ex=x; break;
}
switch(y%3) {
case 0: sy = y; ey=y+2; break;
case 1: sy = y-1; ey=y+1; break;
case 2: sy = y-2; ey=y; break;
}
for(int i=sx; i<=ex; i++) {
for(int j=sy; j<=ey; j++) {
if(arr[i][j] == arr[x][y] && i != x && j != y) {
return false;
}
}
}
return true;
}
public static void print() {
for(int i=0; i<9; i++) {
for(int j=0; j<9; j++) {
sb.append(arr[i][j] + " ");
}
sb.append("\n");
}
System.out.println(sb);
}
}