每日一篇算法题——数独

来源:互联网 发布:硫磺岛战役知乎 编辑:程序博客网 时间:2024/05/21 01:52

数独问题

题目

Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character ‘.’.
You may assume that there will be only one unique solution.
题目
A sudoku puzzle…
这里写图片描述
…and its solution numbers marked in red.

分析

数独规则:每一行、每一列不能有重复数字,且每一个小正方形不能有重复数字(粗线条围起来的九宫格)。

算法

利用回溯法很容易求解。

public class Solution {    public void solveSudoku(char[][] board) {        if(board == null || board.length == 0)            return;        solve(board);    }    public boolean solve(char[][] board){        for(int i = 0; i < board.length; i++){            for(int j = 0; j < board[0].length; j++){                if(board[i][j] == '.'){                    for(char c = '1'; c <= '9'; c++){//尝试填入1-9                        if(isValid(board, i, j, c)){//如果可以填入                            board[i][j] = c; //暂时填入                            if(solve(board))                                return true; //正确答案 返回true                            else                                board[i][j] = '.'; //恢复之前状态                        }                    }                    return false;                }            }        }        return true;//没有一个是‘.’了就返回true    }    private boolean isValid(char[][] board, int row, int col, char c){        for(int i = 0; i < 9; i++) {            if(board[i][col] != '.' && board[i][col] == c) return false; //检查行            if(board[row][i] != '.' && board[row][i] == c) return false; //检查列            if(board[3 * (row / 3) + i / 3][ 3 * (col / 3) + i % 3] != '.' && board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) return false; //检查3*3的九宫格        }        return true;    }}

上面的算法是我看的答案copy下来的,很简洁。

0 0
原创粉丝点击