Java:递归调用中的数组被覆盖

问题描述

我们正在开发一个程序,通过带有回溯的递归方法解决星号数独。

solveIt方法调用solve方法,这是递归方法grid之前被声明为一个9x9 2D数组,其中包含要填写的难题。如果有一个解决方案,则程序必须打印出完整的难题,但是,如果有更多解决方案,则必须仅打印出数字可能的解决方案。

问题是:在solve内部,print();可以正常工作并打印出完整的谜题。但是,在方法之外,它会打印出空的初始拼图。为什么是这样?我们无法弄清楚为什么h完成后,另一个变量(在这种情况下为solve)也会被随机覆盖。

谢谢您的帮助。

int[][] h;
int solutionCounter = 0;
void solve() {
        int[] next = findEmptySquare(); 
        if(!(next[0]==-1 && next[1]==-1))
        {
            if(grid[next[0]][next[1]]==0)
            {
                for (int i=SUDOKU_MIN_NUMBER; i<=SUDOKU_MAX_NUMBER; i++)
                {
                    if(!(givesConflict(next[0],next[1],i)))
                    {
                        //fills in the puzzle
                        grid[next[0]][next[1]] = i;
                        //go to next number
                        solve();
                        
                    }
                }
                grid[next[0]][next[1]]=0;
            }
        }
        else
        {
            //print(); here it works just fine
            solutionCounter++;
            h = grid.clone();
            
        }
        
    }

void solveIt() {
        solve();
        if(solutionCounter>1)
        {
            System.out.println(solutionCounter);
        }
        else
        {
            grid = h.clone();
            print(); //here it prints the empty puzzle
        }
    }

解决方法

解决方案

Temporary breakpoint 1 at 0x111d: file main.cpp,line 1. Temporary breakpoint 1,main () at main.cpp:1 1 int main() {return 0;} From To Syms Read Shared Object Library 0x00007ffff7fd2090 0x00007ffff7ff2746 Yes (*) /lib64/ld-linux-x86-64.so.2 0x00007ffff7e4c040 0x00007ffff7f37b52 Yes /usr/lib/libstdc++.so.6 0x00007ffff7c7f3b0 0x00007ffff7d1a658 Yes (*) /usr/lib/libm.so.6 0x00007ffff7c59020 0x00007ffff7c69ca5 Yes /usr/lib/libgcc_s.so.1 0x00007ffff7ab3650 0x00007ffff7bfe6bd Yes (*) /usr/lib/libc.so.6 (*): Shared library is missing debugging information. 方法似乎只是将.clone()引用到h。因此,grid指向h并采用其值导致我们上面遇到的问题。

因此实施了以下解决方案:

grid

有关.clone()的更多信息:

https://www.geeksforgeeks.org/clone-method-in-java-2/