我正在使用的3x3魔方由1-9填充。每行,每列和对角线中的值都必须加到15。我必须遵循以下伪代码:

recursive_funtion(position) {
    for number from 1 to 9, not used elsewhere already {
        put this number on this position, make it unavailable
        if solution valid {
            if solution complete {
                done, show solution
            }else{
                recursive_function(next_position)
            }
        }
        (make this space blank again, and the number available)
    }
}

我一直在工作,直到通过第一行,才意识到在左上角添加1并在中上角添加2后,没有办法在该行中添加15。有人能够看到我在哪里犯错或填写我所缺少的任何逻辑吗?谢谢。
public class MagicSquare {

    private int[][] magicSquare;
    private boolean[] available;

    public MagicSquare() {
        magicSquare = new int[3][3];
        available = new boolean[9];
        for (int i = 0; i < available.length; i++) {
            available[i] = true;
        }
    }

    public void run() {
        System.out.println("Magic Square Puzzle");
        solve(0, 0);
    }

    public boolean solve(int row, int col) {
    for (int i = 1; i <= 9; i++) {
        if (isAvailable(i)) {
            System.out.println("placing " + i + " at (" + row + ", " + col + ")");
            magicSquare[row][col] = i;
            available[i - 1] = false;
            //solution is valid so far
            if (isFilledRow(row)) {
                if (isValidRow(row) && isValidCol(col)) {
                    if (solve(row, col)) {
                        return true;
                    } else {
                        magicSquare[row][col] = 0;
                        magicSquare[row][col - 1] = 0;
                        col = col - 1;
                        available[magicSquare[row][col] - 1] = false;
                        solve(row, col);
                    }
                }
            }
            if (!isFilledRow(row)) { //check logic here!
                if (isValidSolution()) {
                    System.out.println("You found a correct solution!");
                    printSolution();
                } else {
                    //new row
                    if (col == 2 && row != 2) {
                        row = row + 1;
                        System.out.println("new row and solve(" + row + ", " + col + ")");
                        solve(row, 0);
                        //new col
                    } else if (col != 2) {
                        col = col + 1;
                        System.out.println("new col and solve(" + row + ", " + col + ")");
                        solve(row, col);
                    } else if (row == 2 && col == 2) {
                        //check logic here!

                    }
                }
            }
            magicSquare[row][col] = 0;
            available[i - 1] = true;
        }
    }
    return false;
}

    public boolean isAvailable(int value) {
        if (available[value - 1] == true) {
            System.out.println(value + " is available to be placed");
            return true;
        } else {
            System.out.println(value + " is not available to be placed");
            return false;
        }
    }

    public boolean isFilledRow(int row) {
        if (magicSquare[row][0] != 0 && magicSquare[row][1] != 0 && magicSquare[row][2] != 0) {
            System.out.println("row " + row + " is filled");
            return true;
        } else {
            //System.out.println("row " + row + " is not filled");
            return false;
        }

    }

    public boolean isValidRow(int row) {
        if (magicSquare[row][0] + magicSquare[row][1] + magicSquare[row][2] == 15) {
            System.out.println("row " + row + " adds to 15");
            return true;
        } else {
            System.out.println("row " + row + " does not add to 15");
            return false;
        }
    }

    public boolean isValidCol(int col) {
        if (magicSquare[0][col] + magicSquare[1][col] + magicSquare[2][col] == 15) {
            System.out.println("col " + col + " adds to 15");
            return true;
        } else {
            //System.out.println("col " + col + " does not add to 15");
            return false;
        }
    }

    public boolean isValidOnDiagonals() {
        if ((magicSquare[0][0] + magicSquare[1][1] + magicSquare[2][2] == 15) && (magicSquare[2][0] + magicSquare[1][1] + magicSquare[0][2] == 15)) {
            System.out.println("diagonals add to 15");
            return true;
        } else {
            //System.out.println("diagonals don't add to 15");
            return false;
        }
    }

    public boolean isValidSolution() {
        for (int i = 0; i < magicSquare.length; i++) {
            if (isValidRow(i) && isValidCol(i) && isValidOnDiagonals()) {
                System.out.println("solution is valid");
                return true;
            }
        }
        //System.out.println("solution is not valid");
        return false;
    }

    public void printSolution() {
        for (int i = 0; i < magicSquare.length; i++) {
            for (int j = 0; j < magicSquare[i].length; j++) {
                System.out.print(magicSquare[i][j] + " ");
            }
            System.out.println();
        }
    }
}

最佳答案

一些问题:

即使正方形无效,

  • isValidSolution()也可以返回true
  • 您的solve()方法的逻辑有点太复杂了。我试图简化它。
  • 这么多的System.out.println语句实际上对算法的执行时间有很大的影响。所以我注释掉了大多数。

  • 我相信您可以继续改进,目前,找到第一个解决方案并没有停止。它实际上打印出所有解决方案。

    希望您可以使用它使您更接近最终/抛光算法:
    public class MagicSquare {
    
        private int[][] magicSquare;
        private boolean[] available;
    
        public MagicSquare() {
            magicSquare = new int[3][3];
            available = new boolean[9];
            for (int i = 0; i < available.length; i++) {
                available[i] = true;
            }
        }
    
        public void run() {
            System.out.println("Magic Square Puzzle");
            solve(0, 0);
        }
    
        public void solve(int row, int col) {
        for (int i = 1; i <= 9; i++) {
            if (isAvailable(i)) {
                //System.out.println("placing " + i + " at (" + row + ", " + col + ")");
                magicSquare[row][col] = i;
                available[i - 1] = false;
                //solution is valid so far
                if (isFilled()) {
                    if (isValidSolution()) {
                        System.out.println("You found a correct solution!");
                        printSolution();
                    }
                } else {
                    if (col != 2) {
                        //System.out.println("new col and solve(" + row + ", " + col + ")");
                        solve(row, col + 1);
                    } else if (row != 2) {
                        //System.out.println("new row and solve(" + row + ", " + col + ")");
                        solve(row + 1, 0);
                        //new col
                    }
                }
                magicSquare[row][col] = 0;
                available[i - 1] = true;
            }
        }
    }
    
        public boolean isAvailable(int value) {
            if (available[value - 1] == true) {
                //System.out.println(value + " is available to be placed");
                return true;
            } else {
                //System.out.println(value + " is not available to be placed");
                return false;
            }
        }
    
        public boolean isValidRow(int row) {
            if (magicSquare[row][0] + magicSquare[row][1] + magicSquare[row][2] == 15) {
                //System.out.println("row " + row + " adds to 15");
                return true;
            } else {
                //System.out.println("row " + row + " does not add to 15");
                return false;
            }
        }
    
        public boolean isValidCol(int col) {
            if (magicSquare[0][col] + magicSquare[1][col] + magicSquare[2][col] == 15) {
                //System.out.println("col " + col + " adds to 15");
                return true;
            } else {
                //System.out.println("col " + col + " does not add to 15");
                return false;
            }
        }
    
        public boolean isValidOnDiagonals() {
            if ((magicSquare[0][0] + magicSquare[1][1] + magicSquare[2][2] == 15) && (magicSquare[2][0] + magicSquare[1][1] + magicSquare[0][2] == 15)) {
                //System.out.println("diagonals add to 15");
                return true;
            } else {
                //System.out.println("diagonals don't add to 15");
                return false;
            }
        }
    
        public boolean isValidSolution() {
            for (int i = 0; i < magicSquare.length; i++) {
                if (!isValidRow(i) || !isValidCol(i)) {
                    //System.out.println("solution is valid");
                    return false;
                }
            }
            //System.out.println("solution is not valid");
            return isValidOnDiagonals();
        }
    
        public boolean isFilled() {
            for (int i = 0; i < available.length; i++) {
                if (available[i]) {
                    return false;
                }
            }
            return true;
        }
    
        public void printSolution() {
            for (int i = 0; i < magicSquare.length; i++) {
                for (int j = 0; j < magicSquare[i].length; j++) {
                    System.out.print(magicSquare[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    

    关于java - 生成3x3魔方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31714356/

    10-10 18:35