nubela
nubela

Reputation: 17314

Help me debug this chunk of code which has no compilation errors but is not working as expected

I am coding this Sudoku Solver with the following algorithm:

Given a grid which is assumed to be a valid sudoku puzzle and exists at least 1 solution, it'll find the first solution and return it.

The puzzle is stored in a 2D array representing 9x9 slots.

If a solution does not exist, it returns a puzzle where puzzle[0][0] = 0, else all slots in the puzzle is supposedly filled up with values (1-9).

The algorithm is a bruteforce recursive method:

  1. It searches the puzzle row by row for a single slot.
  2. The method possibleValuesInGrid() returns the possible values that can fit into the slot based on the current puzzle and its existing values.
  3. If there are no possible values to be placed in the slot, it returns a False (puzzle[0][0] = 0)
  4. ELSE, it pops one of the values from the LinkedList of possible values and insert into the slot, and recursively call the same method again till all the slots are filled up.

The code is being hosted at pastebin so I don't flood this page. I suspect there might be a logic error somewhere although its a bruteforce method, or even a bug that I can't seem to figure.

I have hardcoded some system printlines to read through to figure for logic error, however I couldn't figure out where.

Also, how it stopped at [8][4] is also curious.

Upvotes: 0

Views: 208

Answers (1)

Galghamon
Galghamon

Reputation: 2042

Your code fails because you are using clone on a multi-dimensional array (line 44). A clone only give you a shallow copy and in the case of a 2-dimensional array, that's not good enough. You need System.arraycopy(), but on each row, so call something like

public void 2dArrayCopy(int[][] source,int[][] target) {
    for (int a=0; a<source.length; a++) {
        System.arraycopy(source[a],0,target[a],0,source[a].length);
    }
}

You can see the symptom of your failed clone on your log on line 49, where the code suddenly sees a puzzle with an empty slot at 0:0.

Upvotes: 5

Related Questions