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); } } }