有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数独求解器回溯算法

我正在尝试用Java编写数独解算器。我的程序是创建随机板,然后它试图解决该板

为此,我编写了检查列、行和框的函数,并下载了回溯求解算法的实现

我已经分析了这个实现,我认为它应该可以工作,但它没有。它总是返回到不可能找到解决方案的状态

我也试着自己实现,但结果总是一样的

请帮我做这个

package sudoku;

import java.util.Random;

public class Game {
    int[][] board = new int[9][9];
Random rand = new Random();

public Game(){
    for(int y = 0; y<9; y++)
        for(int x =0; x<9; x++)
            board[x][y] = -1;

    fill(40);
    System.out.println("STARTING BOARD:\n");
    draw();

    System.out.println("\n SOLVED BOARD:");
    if (solve(0,0))    // solves in place
        draw();
    else
        System.out.println("NO SOLUTION!");
}

private void fill(int numbeOfKnownValues){
    int counter=0;

    while(counter != numbeOfKnownValues){
        int Xindex = rand.nextInt((9 - 1) + 0) + 0; //look for the x index in board
        int Yindex = rand.nextInt((9 - 1) + 0) + 0; //look for the y index in board
        int val = rand.nextInt((9 - 1) + 1) + 1;

        if(check(Xindex, Yindex, val)) {
            board[Xindex][Yindex] = val;
        } else continue;

        counter++;
    }
}

private boolean checkColumns(int Xindex, int Yindex, int val){
    if(board[Xindex][Yindex]==-1){
        for(int y=0;y<9;y++){ //check columns
            if(board[Xindex][y]==val) return false;
        }
    } else return false;
    return true;
}

private boolean checkRows(int Xindex, int Yindex, int val){
    if(board[Xindex][Yindex]==-1){
        for(int x=0;x<9;x++){ //check columns
            if(board[x][Yindex]==val) return false;
        }
    } else return false;
    return true;
}

private boolean checkSquares(int Xindex, int Yindex, int val){
    int square_Xindex = (Xindex / 3)*3; 
    int square_Yindex = (Yindex / 3)*3;
    for (int k = 0; k < 3; ++k) // box
        for (int m = 0; m < 3; ++m)
            if (val == board[square_Xindex+k][square_Yindex+m])
                return false;

    return true;
}

private boolean check(int Xindex, int Yindex, int val){
    if(checkColumns(Xindex, Yindex, val) && checkRows(Xindex, Yindex, val) && checkSquares(Xindex, Yindex, val)) return true;
    return false;
}

public boolean solve(int i, int j) {
    if (i == 9) {
        i = 0;
        if (++j == 9)
            return true;
    }

    if (board[i][j] != -1)  // skip filled cells
        return solve(i+1,j);

    for (int val = 1; val <= 9; val++) {
        if (check(i,j,val)) {
            board[i][j] = val;
            if (solve(i+1,j))
                return true;
        }
    }
    board[i][j] = -1; // reset on backtrack
    return false;
}

public void draw(){
    for (int i = 0; i < 9; ++i) {
        if (i % 3 == 0)
            System.out.println(" -----------------------");
        for (int j = 0; j < 9; ++j) {
            if (j % 3 == 0) System.out.print("| ");

            System.out.print(board[i][j] == -1 ? " " : Integer.toString(board[i][j]));
            System.out.print(' ');
        }
        System.out.println("|");
    }
    System.out.println(" -----------------------");
}

}


共 (0) 个答案