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 CloneOfStaticsOfRowOrColumnToBeCalculated(RowOrColumnToBeCalculated[] rowOrColumnToBeCalculated, int index) { isMainFieldFilled = RowOrColumnToBeCalculated.IsMainFieldFilled; totalFilledCells = RowOrColumnToBeCalculated.TotalFilledCells; mainField = new Cell[RowOrColumnToBeCalculated.RowsCount, RowOrColumnToBeCalculated.ColumnsCount]; mainField = RowOrColumnToBeCalculated.CloneMainField(); possibleSolutions = new List <bool[]>(); cloneRowOrColumnToBeCalculated = new RowOrColumnToBeCalculated[RowOrColumnToBeCalculated.RowsCount + RowOrColumnToBeCalculated.ColumnsCount]; RowOrColumnToBeCalculated.CloneArray(rowOrColumnToBeCalculated, cloneRowOrColumnToBeCalculated); }