用java语言写,要求有算法分析过程和注释,【数独游戏】九宫格是在81个格子(9×9)中,要满足以下条件:① 每个横行和竖列中的9个格子都包含数字1~9,且不重复;② 每个黑色粗实线围住的9个格子(3×3)都包含数字1~9,且不重复。如图所示: 要求:设计一个回溯法找出给定数字的九宫格。 输入:输入9行9列81个数字,其中0表示要填的数字。 输出:输出满足条件的九宫格。
时间: 2024-02-22 12:56:11 浏览: 111
好的,这是一个关于数独游戏的问题,需要用Java编写一个回溯算法来解决。以下是Java代码,包含注释和算法分析:
```java
import java.util.Scanner;
public class SudokuSolver {
private static final int SIZE = 9; // 数独格子的大小
private static final int EMPTY = 0; // 空格子的标记
public static void main(String[] args) {
int[][] board = new int[SIZE][SIZE]; // 数独格子的二维数组
Scanner scanner = new Scanner(System.in);
// 读取输入的数独格子
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
board[i][j] = scanner.nextInt();
}
}
// 输出解决后的数独格子
if (solveSudoku(board)) {
printBoard(board);
} else {
System.out.println("No solution found.");
}
}
private static boolean solveSudoku(int[][] board) {
// 找到一个未填数字的格子
int row = -1, col = -1;
boolean isEmpty = false;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == EMPTY) {
row = i;
col = j;
isEmpty = true;
break;
}
}
if (isEmpty) {
break;
}
}
// 如果没有未填数字的格子,说明数独已经解决
if (!isEmpty) {
return true;
}
// 依次尝试填1~9的数字,看哪个数字可以满足要求
for (int num = 1; num <= SIZE; num++) {
if (isValid(board, row, col, num)) {
board[row][col] = num; // 填入数字
if (solveSudoku(board)) { // 递归调用继续填数字
return true;
}
board[row][col] = EMPTY; // 如果当前数字无法满足要求,就回溯到上一步
}
}
return false;
}
private static boolean isValid(int[][] board, int row, int col, int num) {
// 检查当前行和列是否已经有num这个数字
for (int i = 0; i < SIZE; i++) {
if (board[row][i] == num || board[i][col] == num) {
return false;
}
}
// 检查当前小方格是否已经有num这个数字
int rowStart = (row / 3) * 3;
int colStart = (col / 3) * 3;
for (int i = rowStart; i < rowStart + 3; i++) {
for (int j = colStart; j < colStart + 3; j++) {
if (board[i][j] == num) {
return false;
}
}
}
return true;
}
private static void printBoard(int[][] board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
}
```
算法分析:
这是一个经典的回溯算法,通过递归实现。具体步骤如下:
1. 找到一个未填数字的格子。
2. 依次尝试填1~9的数字,看哪个数字可以满足要求。
3. 如果当前数字无法满足要求,就回溯到上一步。
4. 如果所有的格子都已经填满,说明数独已经解决。
5. 如果没有未填数字的格子,说明数独无解。
在填数字的过程中,要检查当前行、列和小方格是否已经有相同的数字,如果有就不能填。如果填完当前数字后,数独无法解决,就要回溯到上一步,撤销当前的填法,尝试其他的数字。
阅读全文