백준
백준 백트래킹 - 2580번 : 스도쿠
맴썰
2022. 2. 14. 18:01
https://www.acmicpc.net/problem/2580
2580번: 스도쿠
스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루
www.acmicpc.net
import java.io.*;
import java.util.*;
class blank{
int i;
int j;
public blank(int i, int j) {
this.i = i;
this.j = j;
}
}
public class Main {
static ArrayList<blank> b = new ArrayList<>();
static int[][] board = new int[9][9];
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
for(int i=0; i<9; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<9;j++) {
board[i][j] = Integer.parseInt(st.nextToken());
if(board[i][j]==0) {
b.add(new blank(i,j));
}
}
}
func(0,b.size());
}
public static void func(int now, int target) {
if(now==target) {
for(int i=0; i<9; i++) {
for(int j=0; j<9; j++) {
System.out.print(board[i][j]+" ");
}
System.out.println();
}
System.exit(0);
}
int i = b.get(now).i;
int j = b.get(now).j;
for(int k=1; k<=9; k++) {
if(check(i,j,k)) {
board[i][j] = k;
func(now+1,target);
board[i][j] = 0;
}
}
}
public static boolean check(int i, int j, int num) {
for(int k=0; k<9; k++) {
if(board[i][k]==num) return false;
if(board[k][j]==num) return false;
}
int k = -1;
int l = -1;
if(i/3>0) {
k = i/3*3;
}
else k = 0;
if(j/3>0) {
l = j/3*3;
}
else l = 0;
int itarget = k+3;
int jtarget = l+3;
for(; k<itarget; k++) {
for(; l<jtarget; l++) {
if(board[k][l]==num) return false;
}
l-=3;
}
return true;
}
}