利用回溯法解数独游戏
package com.backtrack;
import static java.lang.String.format;
public class Sudoku75 extends BackTrack {
public static final int[][] board = {
{ 5, 3, 0, 0, 7, 0, 0, 0, 0 },
{ 6, 0, 0, 1, 9, 5, 0, 0, 0 },
{ 0, 9, 8, 0, 0, 0, 0, 6, 0 },
{ 8, 0, 0, 0, 6, 0, 0, 0, 3 },
{ 4, 0, 0, 8, 0, 3, 0, 0, 1 },
{ 7, 0, 0, 0, 2, 0, 0, 0, 6 },
{ 0, 6, 0, 0, 0, 0, 2, 8, 0 },
{ 0, 0, 0, 4, 1, 9, 0, 0, 5 },
{ 0, 0, 0, 0, 8, 0, 0, 7, 9 },
};
public static final int[][][] sudokuMap = new int[9][9][2];
public static boolean backtraking(int[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] > 0) {
continue;
}
for (int num = 1; num <= 9; num++) {
if (isValid(i, j, num)) {
board[i][j] = num;
boolean success = backtraking(board);
if (success) {
return true;
}
board[i][j] = 0;
}
}
return false;
}
}
return true;
}
public static void initSudokuMap() {
for (int i = 0; i < sudokuMap.length; i++) {
for (int j = 0; j < sudokuMap.length; j++) {
int rowStartIndex = i / 3 * 3;
int columnStartIndex = j / 3 * 3;
sudokuMap[i][j] = new int[] { rowStartIndex, columnStartIndex };
}
}
}
public static boolean isValid(int row, int column, int num) {
if (board[row][column] > 0) {
return false;
}
for (int j = 0; j < 9; j++) {
if (board[row][j] == num) {
return false;
}
}
for (int i = 0; i < 9; i++) {
if (board[i][column] == num) {
return false;
}
}
int sudokuRowStart = sudokuMap[row][column][0];
int sudokuColumnStart = sudokuMap[row][column][1];
for (int i = sudokuRowStart; i < sudokuRowStart + 3; i++) {
for (int j = sudokuColumnStart; j < sudokuColumnStart + 3; j++) {
if (board[i][j] == num) {
return false;
}
}
}
return true;
}
public static void printBoard() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(format("%s ", board[i][j]));
}
System.out.println();
}
}
public static void main(String[] args) {
initSudokuMap();
int row = 3;
int column = 5;
for (int i = 0; i < sudokuMap[row][column].length; i++) {
System.out.print(format("%s\t", sudokuMap[row][column][i]));
}
System.out.println("=============================");
System.out.println(isValid(6, 7, 1));
boolean success = backtraking(board);
if (success) {
printBoard();
}
}
}