数独问题(java)

数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。

public class Sudoku {


    private static int[][] board = new int[9][9];

    public static void main(String[] args) throws IOException{
        readFile("sudoku_data_01");//利用IO流读取文件数据 填入一个9*9的数组内
        solve(0, 0);
    }

    //求解x-y 格子的解 在继续向下递归求解下一个格子
    //本质求多个解 但是实际 数独问题只能有一个解 如果没有解 程序啥也不输出
    //我们要解决一列完后,才继续向下解决问题所以col = (col + 1) % 9  row = row + (col + 1) / 9
    private static void solve(int row, int col) {//[row, col]为当前正在解决的格子
        if (row == 9){
            printBoard();
        }else {
            if (board[row][col] == 0){
                //需要填数字 1~9
                for (int num = 1; num <= 9; num++) {
                    if (!isExist(row, col, num)){
                        board[row][col] = num;
                        //解决下一个格子
                        solve(row + (col + 1) / 9, (col + 1) % 9);
                    }
                    //如果此处没有解 必须清零
                    board[row][col] = 0;
                }
            }else {//如果格子内数字不为1说明含有数字直接跳入下一个格子
                solve(row + (col + 1) / 9, (col + 1) % 9);

            }
        }
    }

    private static boolean isExist(int row, int col, int num) {
        //同行
        for (int c = 0; c < 9; c++) {
            if (board[row][c] == num){
                return true;
            }
        }
        //同列
        for (int r = 0; r < 9; r++) {
            if (board[r][col] == num){
                return true;
            }
        }
        //同九宫 3*3
        int rowMin = 0;
        int colMin = 0;

        int rowMax = 0;
        int colMax = 0;
        if (row >= 0 && row <= 2){
            rowMin = 0;
            rowMax = 2;
        }
        if (row >= 3 && row <= 5){
            rowMin = 3;
            rowMax = 5;
        }
        if (row >= 6 && row <= 8){
            rowMin = 6;
            rowMax = 8;
        }
        if (col >= 0 && col <= 2){
            colMin = 0;
            colMax = 2;
        }
        if (col >= 3 && col <= 5){
            colMin = 3;
            colMax = 5;
        }
        if (col >= 6 && col <= 8){
            colMin = 6;
            colMax = 8;
        }
        for (int r = rowMin; r <= rowMax; r++) {
            for (int c = colMin; c <= colMax; c++) {
                if (board[r][c] == num){
                    return true;
                }
            }
        }
        return false;
    }

    private static void readFile(String fileName) throws IOException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        int row = 0;
        while ((line = br.readLine()) != null){
            for (int col = 0; col < 9; col++) {
                board[row][col] = Integer.parseInt(line.charAt(col) + "");
            }
            row++;
        }

    }

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值