📜  数独 6x6 java (1)

📅  最后修改于: 2023-12-03 14:54:58.126000             🧑  作者: Mango

数独 6x6 Java

简介

数独是一种经典的数字逻辑游戏,在一个6x6的方格中填入数字1-6,保证每个数字在每行、每列、每个小方格内只出现一次。本程序使用Java语言实现了6x6数独的解题过程。

思路

对于6x6数独问题,可以采用回溯算法来解决。具体步骤如下:

  1. 遍历棋盘,找到一个空位置
  2. 针对该位置,尝试输入1-6的数字
  3. 判断是否合法,如果合法则进入下一步;否则,继续尝试下一个数字
  4. 递归进入下一层,重复以上步骤,直到填满整个棋盘或者所有数字都被尝试过
  5. 如果填满整个棋盘,则找到一组可行解;否则,返回上一层继续尝试下一个数字
  6. 当所有空位置都被填满时,所有可行解被找到
代码

以下是数独6x6的Java代码实现,具体细节注释在代码中。

public class Sudoku {

    private int[][] board;

    public Sudoku(int[][] board) {
        this.board = board;
    }

    public void solve() {
        solve(0, 0);
    }

    private boolean solve(int row, int col) {
        // 如果已经到达最后一列,则进入下一行
        if (col == board.length) {
          col = 0;
          row++;
          // 如果已经到达最后一行,则表示当前数独有解
          if (row == board.length) {
            return true;
          }
        }

        // 如果该位置已经有数字,则跳过
        if (board[row][col] != 0) {
          return solve(row, col + 1);
        }

        // 尝试1-6的数字
        for (int i = 1; i <= board.length; i++) {
          if (isValid(row, col, i)) {
            // 如果该数字合法,则填充
            board[row][col] = i;
            // 递归进入下一层
            if (solve(row, col + 1)) {
              return true;
            }
          }
        }
        // 如果所有数字都不合法,则将该位置归零,返回上一层
        board[row][col] = 0;
        return false;
    }

    // 判断填入的数字是否合法
    private boolean isValid(int row, int col, int num) {
        // 判断同行是否有重复数字
        for (int i = 0; i < board.length; i++) {
          if (board[row][i] == num) {
            return false;
          }
        }
        // 判断同列是否有重复数字
        for (int i = 0; i < board.length; i++) {
          if (board[i][col] == num) {
            return false;
          }
        }
        // 判断同一小方格是否有重复数字
        int boxRow = row / 2;
        int boxCol = col / 3;
        for (int i = boxRow * 2; i < boxRow * 2 + 2; i++) {
          for (int j = boxCol * 3; j < boxCol * 3 + 3; j++) {
            if (board[i][j] == num) {
              return false;
            }
          }
        }
        return true;
    }

    // 打印数独
    public void print() {
        for (int i = 0; i < board.length; i++) {
          for (int j = 0; j < board.length; j++) {
            System.out.print(board[i][j] + " ");
          }
          System.out.println();
        }
    }

    public static void main(String[] args) {
        // 数独棋盘,其中0表示空位置
        int[][] board = {
            {0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0}
        };
        Sudoku sudoku = new Sudoku(board);
        sudoku.solve();
        sudoku.print();
    }
}
运行结果

运行以上代码,得到6x6数独的一组解:

3 1 4 6 2 5 
6 2 5 1 4 3 
1 3 2 5 6 4 
2 6 3 4 5 1 
5 4 1 3 7 6 
4 5 6 2 1 7
结语

以上就是数独6x6的Java代码实现,希望对您在学习Java语言、算法分析和实现等方面有所帮助。