Beispiel #1
0
        private void TryEveryVariantIfNoSolusion()
        {
            int indexOfFirstElement = RowOrColumnToBeCalculated.GetIndexOfRowOrColumnByNumberInQueue(rowsAndColumnsToBeCalculated, 0);
            int variantsCount       = rowsAndColumnsToBeCalculated[indexOfFirstElement].VariantsCount;
            CloneOfStaticsOfRowOrColumnToBeCalculated clone = new CloneOfStaticsOfRowOrColumnToBeCalculated(rowsAndColumnsToBeCalculated, indexOfFirstElement);

            for (int i = 0; i < variantsCount; i++)
            {
                RowOrColumnToBeCalculated.SetStatics(rowsAndColumnsToBeCalculated, clone);
                rowsAndColumnsToBeCalculated[indexOfFirstElement].possibleSolutions = new List <bool[]>();
                rowsAndColumnsToBeCalculated[indexOfFirstElement].possibleSolutions.Add(clone.cloneRowOrColumnToBeCalculated[indexOfFirstElement].possibleSolutions[i]);
                rowsAndColumnsToBeCalculated[indexOfFirstElement].VariantsCount = 1;
                RowOrColumnToBeCalculated.Calculate(rowsAndColumnsToBeCalculated);
                if (RowOrColumnToBeCalculated.IsMainFieldFilled)
                {
                    solutions.Add(RowOrColumnToBeCalculated.CloneMainField());
                }
                else
                {
                    if (!RowOrColumnToBeCalculated.IsError)
                    {
                        TryEveryVariantIfNoSolusion();
                    }
                }
                for (int j = 0; j < rowsAndColumnsToBeCalculated.Length; j++)
                {
                    Task.WaitAll(rowsAndColumnsToBeCalculated[j].tasksForRemovingIrrelevantVariants.ToArray());
                }
            }
        }
 internal static void SetStatics(RowOrColumnToBeCalculated[] rowsAndColumnsToBeCalculated, CloneOfStaticsOfRowOrColumnToBeCalculated clone)
 {
     // возврат статических значений при вызове перебора всех вариантов
     CloneArray(clone.cloneRowOrColumnToBeCalculated, rowsAndColumnsToBeCalculated);
     rowsAndColumnsToBeCalculated = (RowOrColumnToBeCalculated[])clone.cloneRowOrColumnToBeCalculated.Clone();
     IsError           = false;
     IsMainFieldFilled = clone.isMainFieldFilled;
     TotalFilledCells  = clone.totalFilledCells;
     for (int i = 0; i < RowsCount; i++)
     {
         for (int j = 0; j < ColumnsCount; j++)
         {
             mainField[i, j]       = new Cell();
             mainField[i, j].State = clone.mainField[i, j].State;
             Cell.FillCell(i, j, mainField[i, j].State == StatesOfCell.empty ? false : true, mainField[i, j].State == StatesOfCell.unknown ? true : false);
         }
     }
 }