This 링크에는 Sudoku Solver 알고리즘의 Backtracking 구현이 있습니다. 처음에 할당 된 값이 유효한 출력을 제공하지 않을 경우 행 번호 42가 셀에 처음 할당 된 값을 다른 값으로 되돌려 놓는 것에 유의하십시오.Sudoku 솔버의 구현은 상태를 저장하지 않고 어떻게 작동합니까?
그러나 셀의 값을 변경하는 것만으로 얼마나 효과가 있는지 이해할 수 없습니다. 이 호출은 배열 (행렬)이 메모리 (참조)에 의해 전달 되었기 때문에 많은 다른 호출을 트리거 할 수 있었고 일 수 있었으며 재귀 적 호출을 할 때마다 행렬 (grid [N] [N])의 복사본을 보관하지 않습니다. 함수이므로 재귀의 기본 경우가 반환 될 때까지 재귀의 첫 번째 프레임에도 반영됩니다.
나에 따르면, 재귀 함수를 호출하기 전에 grid [N] [N]의 임시 복사본을 만들고 호출이 반환되고 즉시 같은 프레임의 다음 함수가 실행되기 전에 복원해야합니다. 라는.
for (int num = 1; num <= N; num++)
{
// if looks promising
if (isSafe(grid, row, col, num))
{
//save grid state
int[][] temp = new int[N][N];
save(temp,grid); //copy all values from grid to temp
// make tentative assignment
grid[row][col] = num;
// return, if success, yay!
if (SolveSudoku(grid))
return true;
//restore grid state
restore(temp,grid); //copy all values from temp back to grid
// failure, unmake & try again
grid[row][col] = UNASSIGNED;
}
}
날이 세부 사항을 이해하는 데 도움이됩니다 같은
는뭔가.
나머지 코드를 검토하지 않고 신뢰할 수있는 대답을 제공 할 수는 없습니다. 하지만 stackoverflow.com 정말이 장소가 아닙니다. 'UNASSIGNED'할당이 이동을 되돌릴 것으로 보이기 때문에 원래 그리드의 백 사본이 불필요하다고 보이지만 실제로는 100 % 확실성으로 말할 수는 없습니다. 그러나 이것이 바로 디버거가 필요한 것입니다. 인터넷에서 낯선 사람에게 도움을 요청할 필요없이 컴퓨터에서 찾을 수있는이 유용한 도구를 사용하여 한 번에 한 줄씩이 코드를 단계별로 실행하고 작동 방법을 직접 확인하십시오. –
각 재귀 수준에서 코드는 하나의 셀을 할당하고 하나의 셀을 되돌립니다. 전체 그리드를 저장하는 것은 필요하지 않습니다. 원래 상태가 각 재귀 호출이 반환 된 후에 한 번에 하나의 셀로 복원되기 때문입니다. 완전한 상태가 호출 스택에, 각 재귀 수준에서 저장 될 로컬 변수 row 및 col에 저장된다고 말할 수 있습니다. – samgak