问题描述
我们正在开发一个程序,通过带有回溯的递归方法来解决星号数独。
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()的更多信息: