private boolean solve(int i, int j, int initialValue, int board[][])
    {
        boolean desisionWasFound = false;
        if (i == mBoardSize)
        {
            i = 0;
            if (++j == mBoardSize)
            {
                return true;
            }
        }
        if (board[i][j] != 0)
        {
            return solve(i + 1, j, 1, board);
        }
        int maxSize = mBoardSize;
        if (i == 0 && j == 0){
            maxSize = initialValue;
        }
        for (int value = initialValue; value <= maxSize; value++)
        {
            if (isValid(i, j, value))
            {
                board[i][j] = value;
                setSubsetValue(i, j, value, true);
                if (solve(i + 1, j, 1, board))
                {
                    setSubsetValue(i, j, value, false);
                    return true;
                }
                setSubsetValue(i, j, value, false);
            }
        }

        board[i][j] = 0;
        return desisionWasFound;
    }