import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {

        int[][] data = new int[9][9];
        Scanner in = new Scanner(System.in);
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                data[i][j] = in.nextInt();
            }
        }

        dfs(0, data);
    }


    public static void dfs(int pos, int[][] data) {

        if (pos == 81) {
            print(data);
            System.exit(0);
        }

        int i = pos / 9;
        int j = pos % 9;

        if (data[i][j] == 0) {
            for (int alt = 1; alt < 10; alt++) {
                if (checkAlt(data, i, j, alt)) {
                    data[i][j] = alt;
                    dfs(pos + 1, data);
                }
            }
            data[i][j] = 0;  // 恢复现场
        } else {
            dfs(pos + 1, data);
        }
    }


    public static boolean checkAlt(int[][] data, int i, int j, int alt) {

        for (int k = 0; k < 9; k++) {
            if (data[i][k] == alt) {
                return false;
            }
        }

        for (int k = 0; k < 9; k++) {
            if (data[k][j] == alt) {
                return false;
            }
        }

        int row = i / 3 * 3;
        int column = j / 3 * 3;
        if (data[row][column] == alt ||
                data[row][column + 1] == alt ||
                data[row][column + 2] == alt ||
                data[row + 1][column] == alt ||
                data[row + 1][column + 1] == alt ||
                data[row + 1][column + 2] == alt ||
                data[row + 2][column] == alt ||
                data[row + 2][column + 1] == alt ||
                data[row + 2][column + 2] == alt) {
            return false;
        }
        return true;
    }


    public static void print(int[][] data) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                System.out.print(data[i][j] + " ");
            }
            System.out.println();
        }
    }
}

将格子依次编号为0,1,2,...,80,
依次遍历每个格子pos,
int i = pos / 9
int j = pos % 9
如果格子的数值为0,则依次尝试填入1,2,3,4,5,6,7,8,9.  和第i行,第j列以及所在九宫格已有的数字不重复即可。
如果格子的数值不为0,则继续 dfs(pos+1,data)
如果pos达到了81,则说明所有格子里面的数值是符合要求的。
需要注意的是递归调用完成之后没有完成则需要恢复现场。