private static Puzzle bruteForce(Puzzle puzzle) {
        if (puzzle.isInvalid())
            return null;
        if (puzzle.isComplete())
            return puzzle;

        //Find cell with smallest available then start there.
        int row = 0;
        int col = 0;
        int smallest = Integer.MAX_VALUE;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j< 9; j++) {
                if (!puzzle.getAvailable().get(i).get(j).isEmpty() && puzzle.getAvailable().get(i).get(j).size() < smallest) {
                    smallest = puzzle.getAvailable().get(i).get(j).size();
                    row = i;
                    col = j;
                }
            }
        }

        for (int avail : puzzle.getAvailable().get(row).get(col)) {
            Puzzle copy = new Puzzle(puzzle);
            copy.confirm(row, col, avail, false);
            Puzzle result = bruteForce(copy);
            if (result != null)
                return result;

        }

        return null;
    }