public bool Init(Board inBoard)
 {
     bool ok = true;
     FillValuesWithRange();
     for (int i = 0; i < 9 && ok; ++i)
         if (!inBoard.IsAvailable(i, mRowIndex))
             ok = AssignValue(inBoard.Get(i, mRowIndex));
     return ok;
 }
 public bool Init(Board inBoard)
 {
     bool ok = true;
     FillValuesWithRange();
     if (mTopToBottom)
     {
         for (int i = 0; i < 9 && ok; ++i)
             if (!inBoard.IsAvailable(i,i))
                 ok = AssignValue(inBoard.Get(i,i));
     }
     else
     {
         for (int i = 0; i < 9 && ok; ++i)
             if (!inBoard.IsAvailable(i, 8 - i))
                 ok = AssignValue(inBoard.Get(i, 8 - i));
     }
     return ok;
 }
 public bool Init(Board inBoard)
 {
     bool ok = true;
     FillValuesWithRange();
     for (int i = 0; i < 3 && ok; ++i)
         for (int j = 0; j < 3 && ok; ++j)
             if (!inBoard.IsAvailable(i + mLeftColumn, j + mTopRow))
                 ok = AssignValue(inBoard.Get(i + mLeftColumn, j + mTopRow));
     return ok;
 }
 public bool Init(
     Board inBoard,
     AssignmentConstraint[] inConstraints,
     int inConstraintsCount
 )
 {
     if (inBoard.IsAvailable(mCellColumn, mCellRow))
     {
         if(inConstraintsCount > 0)
         {
             Assign(inConstraints[0]);
             for (int i = 1; i < inConstraintsCount; ++i)
                 IntersectWith(inConstraints[i]);
         }
         return (0 < mAllowedValues.Count);
     }
     else
         return true;
 }
        public bool ImproveSingleNumberAssignment(Board inBoard, BoardConstraints inConstraints)
        {
            if (isFull())
                return false;

            int possibleAssisgnmentsCount = 0;
            List<CellConstraint> cellAssignments = new List<CellConstraint>();
            List<int> numberAssignments = new List<int>();
            CellConstraint aPossibleAssignment = null, aCell;

            foreach (int numberValue in mAllowedValues.Keys)
            {
                possibleAssisgnmentsCount = 0;
                for (int i = 0; i < 9; ++i)
                {
                    aCell = GetCellFromIndex(inConstraints, i);
                    if (inBoard.IsAvailable(aCell.GetColumn(), aCell.GetRow()) &&
                        aCell.CanAssignValue(numberValue))
                        {
                            ++possibleAssisgnmentsCount;
                            aPossibleAssignment = aCell;
                        }
                }
                if (1 == possibleAssisgnmentsCount)
                {
                    cellAssignments.Add(aPossibleAssignment);
                    numberAssignments.Add(numberValue);
                }
            }

            for (int i = 0; i < cellAssignments.Count; ++i)
            {
                inConstraints.AssignValueToCell(
                    cellAssignments[i].GetColumn(),
                    cellAssignments[i].GetRow(),
                    numberAssignments[i]
                );
            }

            return (cellAssignments.Count > 0);
        }
        public bool HasNumbersWithNoPossibleAssignments(Board inBoard, BoardConstraints inConstraints)
        {
            if (isFull())
                return false;

            int possibleAssisgnmentsCount = 0;
            CellConstraint aCell;

            foreach (int numberValue in mAllowedValues.Keys)
            {
                possibleAssisgnmentsCount = 0;
                for (int i = 0; i < 9; ++i)
                {
                    aCell = GetCellFromIndex(inConstraints, i);
                    if (inBoard.IsAvailable(aCell.GetColumn(), aCell.GetRow()) &&
                        aCell.CanAssignValue(numberValue))
                            ++possibleAssisgnmentsCount;
                }
                if (0 == possibleAssisgnmentsCount)
                    break;
            }

            return (0 == possibleAssisgnmentsCount);
        }