https://www.acmicpc.net/problem/2239
골드 4
스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다음을 보자.

위 그림은 참 잘도 스도쿠 퍼즐을 푼 경우이다. 각 행에 1부터 9까지의 숫자가 중복 없이 나오고, 각 열에 1부터 9까지의 숫자가 중복 없이 나오고, 각 3×3짜리 사각형(9개이며, 위에서 색깔로 표시되었다)에 1부터 9까지의 숫자가 중복 없이 나오기 때문이다.
하다 만 스도쿠 퍼즐이 주어졌을 때, 마저 끝내는 프로그램을 작성하시오.
9개의 줄에 9개의 숫자로 보드가 입력된다. 아직 숫자가 채워지지 않은 칸에는 0이 주어진다.
9개의 줄에 9개의 숫자로 답을 출력한다. 답이 여러 개 있다면 그 중 사전식으로 앞서는 것을 출력한다. 즉, 81자리의 수가 제일 작은 경우를 출력한다.
import java.util.*;
import java.io.*;
class Main {
public static int[][] map = new int[9][9];
public static ArrayList<int[]> empty = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i = 0; i < 9; i++) {
String str = br.readLine();
for(int j = 0; j < 9; j++) {
map[i][j] = str.charAt(j) - '0';
if(map[i][j] == 0){
empty.add(new int[]{i, j});
}
}
}
dfs(0);
}
public static void dfs(int index){
if(index == empty.size()){
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
System.out.print(map[i][j]);
}
System.out.println();
}
System.exit(0);
}
int[] now = empty.get(index);
boolean[] visited = new boolean[10];
for(int i = 1; i <= 9; i++){
visited[map[now[0]][i-1]] = true;
visited[map[i-1][now[1]]] = true;
}
for(int i = (now[0]/3)*3; i < (now[0]/3)*3 + 3; i++){
for(int j = (now[1]/3)*3; j < (now[1]/3)*3 + 3; j++){
visited[map[i][j]] = true;
}
}
for(int i = 1; i <= 9; i++){
if(!visited[i]){
map[now[0]][now[1]] = i;
dfs(index + 1);
map[now[0]][now[1]] = 0;
}
}
}
}