import java.util.Scanner; public class Main { private static final int NUM = 9; public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ solution(in); } } /** * 回溯法 * @param in */ private static void solution(Scanner in){ int[][] matrix = new int[NUM+1][NUM+1]; for(int i=1; i<=NUM; i++){ for(int j=1; j<=NUM; j++){ matrix[i][j] = in.nextInt(); } } trySudoku(matrix); for(int i=1; i<=NUM; i++){ for(int j=1; j<=NUM; j++){ System.out.print(matrix[i][j]+" "); } System.out.println(); } } /** * 递归 * @param matrix * @return */ private static boolean trySudoku(int[][] matrix){ for(int i=1; i<=NUM; i++){ for(int j=1; j<=NUM; j++){ if(matrix[i][j] != 0){ continue; } for(int val=1; val<=NUM; val++){ if(isValid(i, j, val, matrix)){ matrix[i][j] = val; if(trySudoku(matrix)){ return true; } matrix[i][j] = 0; } } return false; } } return true; } /** * 当前数字是否合法 * @param row * @param col * @param val * @param matrix * @return */ private static boolean isValid(int row, int col, int val, int[][] matrix){ // 行 for(int j=1; j<=NUM; j++){ if(matrix[row][j] == val){ return false; } } // 列 for(int i=1; i<=NUM; i++){ if(matrix[i][col] == val){ return false; } } // 九宫格 for(int i=((row-1)/3)*3+1; i<=((row-1)/3)*3+3; i++){ for(int j=((col-1)/3)*3+1; j<=((col-1)/3)*3+3; j++){ if(matrix[i][j] == val){ return false; } } } return true; } }