java - 为什么调用方法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();
}
}
解决方案
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
在这种情况下,不会做你所期望的。它所做的只是阻止您更改引用,它不会使数组本身不可变。它是对可变对象的常量引用。换句话说,只要数组仍然是同一个数组,您就可以更改数组的内容。
推荐阅读
- python - 如何从文本文件创建情节动画(例如 mpeg 电影),而不将它们单独保存到计算机?
- python-2.7 - 'TypeError: 'int' object is not callable' 相隔 5 秒比较读数时
- python - 如何绘制图表以获得二元结果的概率
- haskell - 寻找组合
- javascript - 将 webgl2 与 PIXI 一起使用
- ios - 为 UITableViewCell 指定 Segue
- php - Laravel:在进行 LEFT JOIN 时如何制作字段别名,以便我可以访问具有相同名称的字段
- javascript - 如何添加一个计数器来显示一个 div 元素被点击了多少次?
- assembly - 为什么文件不可用不会给 $v0 带来负值?
- php - 给定的每一行必须为空或带有谷歌图表线的数组