首页 > 解决方案 > 为什么调用方法solve后STORED的变量会发生变化?

问题描述

变量拼图设置为与变量 STORED 具有相同的初始值,但随后通过求解方法进行更改。STORED 变量从未在任何方法中使用。如果 STORED 在 solve 方法之前打印,它会返回其初始 2D 数组,但在 if 语句中它会打印出新的拼图求解值。

public class CA_Cindy {
public static boolean isSafe(int[][] board, int row, int col, int num)
{
    int sqrt;
    int boxRowStart;
    int boxColStart;
    for (int d = 0; d < board.length; d++)
    {
        if (board[row][d] == num)
            return false;
    }
    for (int r = 0; r < board.length; r++)
    {
        if (board[r][col] == num)
            return false;
    }
    sqrt = (int) Math.sqrt(board.length);
    boxRowStart = row - row % sqrt;
    boxColStart = col - col % sqrt;
    for (int r = boxRowStart; r < boxRowStart + sqrt; r++)
    {
        for (int d = boxColStart; d < boxColStart + sqrt; d++)
        {
            if (board[r][d] == num)
                return false;
        }
    }
    return true;
}

public static boolean solve(int[][] board, int n)
{
    int row = -1;
    int col = -1;
    boolean isEmpty = true;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (board[i][j] == 0)
            {
                row = i;
                col = j;
                isEmpty = false;
                break;
            }
        }
        if (!isEmpty)
            break;
    }
    if (isEmpty)
        return true;
    for (int num = 1; num <= n; num++)
    {
        if (isSafe(board, row, col, num))
        {
            board[row][col] = num;
            if (solve(board, n))
                return true;
            else
                board[row][col] = 0;
        }
    }
    return false;
}

public static void print(int[][] board, int N)
{
    for (int r = 0; r < N; r++)
    {
        for (int d = 0; d < N; d++)
        {
            System.out.print(board[r][d]);
            System.out.print(" ");
        }
        System.out.print("\n");
        if ((r + 1) % (int) Math.sqrt(N) == 0)
            System.out.print("");
    }
}
public static void main(String[] args) throws IOException {
    final int[][] STORED = {{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}};
    int[][] puzzle = STORED;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int c, r, d;
    int N = puzzle.length;
    int[][] board = new int[9][9];
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++)
            board[i][j] = STORED[i][j];
    }
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++){}
            //System.out.print(board[i][j] + " ");
        System.out.println();
    }
    System.out.println();
    if (solve(puzzle, N)) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++)
                System.out.print(STORED[i][j] + " ");
            System.out.println();
        }
    }

标签: java

解决方案


puzzle未设置为与 相同的STORED它实际上指的是同一个对象,因此当您更改一个对象时,您会更改另一个对象。考虑以下代码:

public class HelloWorld{

     public static void main(String []args){
        final int[] a = {1, 2, 3};

        int[] b = a;

        System.out.println(a[1]); // Prints 2

        b[1] = 3;

        System.out.println(a[1]); // Prints 3
     }
}

此外,final在这种情况下,不会做你所期望的。它所做的只是阻止您更改引用,它不会使数组本身不可变。它是对可变对象的常量引用。换句话说,只要数组仍然是同一个数组,您就可以更改数组的内容。


推荐阅读