数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入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();
}
}
}