private bool ThereAreIsolatedBlackCells()
        {
            /*
             * if (solver.currentNumberOfBlackCells == solver.maxNumberOfBlackCells &&
             *  solver.currentNumberOfFullCells == solver.maxNumberOfFullCells) {
             *  return false;
             * }
             */

            for (int i = 0; i < solver.gridHeight; i++)
            {
                for (int j = 0; j < solver.gridWidth; j++)
                {
                    if (solver.passedBlackCells.Count > 0)
                    {
                        solver.passedBlackCells = new List <Point>();
                    }
                    if (solver.CellIsBlack(i, j) && !solver.BlackCellHasWayOut(i, j, 0, 0))
                    {
                        if (solver.passedBlackCells.Count == solver.maxNumberOfBlackCells)
                        {
                            return(false);
                        }

                        return(true);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// 1 - up. 2 - right. 3 - down. 4 - left.
        /// </summary>
        /// <param name="row"></param>
        /// <param name="column"></param>
        /// <returns></returns>
        private int BlackCellWayOutDirection(int row, int column)
        {
            int wayOut         = 0;
            int wayOutsCounter = 0;

            // up
            if ((row - 1) >= 0 && (!solver.CellIsFull((row - 1), column) && !solver.CellIsNumber((row - 1), column)))
            {
                if (solver.CellIsEmpty((row - 1), column))
                {
                    wayOut = 1;
                    ++wayOutsCounter;
                }
                else if (solver.BlackCellHasWayOut((row - 1), column, 3, 0))
                {
                    ++wayOutsCounter;
                }
            }

            //right
            if ((column + 1) < solver.gridWidth && (!solver.CellIsFull(row, (column + 1)) && !solver.CellIsNumber(row, (column + 1))))
            {
                if (solver.CellIsEmpty(row, (column + 1)))
                {
                    wayOut = 2;
                    ++wayOutsCounter;
                }
                else if (solver.BlackCellHasWayOut(row, (column + 1), 4, 0))
                {
                    ++wayOutsCounter;
                }
            }

            // down
            if ((row + 1) < solver.gridHeight && (!solver.CellIsFull((row + 1), column) && !solver.CellIsNumber((row + 1), column)))
            {
                if (solver.CellIsEmpty((row + 1), column))
                {
                    wayOut = 3;
                    ++wayOutsCounter;
                }
                else if (solver.BlackCellHasWayOut((row + 1), column, 1, 0))
                {
                    ++wayOutsCounter;
                }
            }

            //left
            if ((column - 1) >= 0 && (!solver.CellIsFull(row, (column - 1)) && !solver.CellIsNumber(row, (column - 1))))
            {
                if (solver.CellIsEmpty(row, (column - 1)))
                {
                    wayOut = 4;
                    ++wayOutsCounter;
                }
                else if (solver.BlackCellHasWayOut(row, (column - 1), 2, 0))
                {
                    ++wayOutsCounter;
                }
            }

            if (wayOutsCounter > 1)
            {
                wayOut = 0;
            }
            return(wayOut);
        }