import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int map[][];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
map = new int[9][9];
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
map[i][j]=sc.nextInt();
}
}
sdoku(0,0);
}
static void sdoku(int row,int col) {
if(col==9) {
sdoku(row+1,0);
return;
}
if(row==9) {
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);
}
if(map[row][col]==0 ) {
for(int i=1;i<=9;i++) {
if(possibility(row,col,i)) {
map[row][col]=i;
sdoku(row,col+1);
}
}
map[row][col]=0; // 기껏 map에 i값을 집어넣어놓고 왜 여기서 0으로 초기화시켜주는거지??
return; // 이 코드가 의미하는게 뭐지 없어도 되는거 아닌가?? 모르겟음 ㅜㅜㅜ
}
sdoku(row,col+1);
}
static boolean possibility(int row,int col,int value) {
for(int i=0;i<9;i++) {
if(map[row][i]==value) {
return false;
}
}
for(int i=0;i<9;i++) {
if(map[i][col]==value) {
return false;
}
}
int set_row =(row/3)*3;
int set_col=(col/3)*3;
for(int i=set_row;i<set_row +3;i++ ) {
for(int j=set_col;j<set_col+3;j++ ) {
if(map[i][j]==value) {
return false;
}
}
}
return true;
}
}
문제링크:https://www.acmicpc.net/problem/2580
초기화 안하면 저 다른값 못넣어보잖아
가지를 한 번 뻗은 후 마지막으로 이전 단계의 가지로 다시 돌아갈 때 다시 그 가지를 뻗을 경우를 대비해 0을 넣는 거야 그래야 다시 뻗을 수 있으니까 세 번째 수까지 구한 상황에서 현재의 조합으로 도저히 네 번째 수로 뻗을 수 없을 경우 세 번째 수도 과감하게 지우고, 다시 두 번째 수에서 세 번째 수를 찾게 되겠지 다시 값을 초기화하는 건 이전 단계로 돌아가 다시 그 값을 다른 값으로 정해 가지를 뻗을 준비를 하는 거라고 할 수 있어
이해가 갈듯말듯하네