private static void GenerateAllPossibleSlicingLayouts( Pizza pizza, List <PossibleSlices> possibleSlices, List <SlicePizza> successfulSlices, int totalSlicedCells, int currentPossibilityIndex) { if (currentPossibilityIndex < possibleSlices.Count) { Parallel.For(currentPossibilityIndex, possibleSlices.Count, i => { var possibility = possibleSlices[i]; foreach (var slice in possibility.Slices) { var realSlice = new SlicePizza(pizza, possibility.OriginPoint, slice.EndPoint); if (!realSlice.IsValidSlice) { continue; } var pizzaCloned = pizza.Clone(); var nextPossibilityIndex = i + 1; var successfulSlicesCloned = successfulSlices.GetRange(0, successfulSlices.Count); pizzaCloned.CutSlice(realSlice); successfulSlicesCloned.Add(realSlice); var totalSlicedCellsCloned = totalSlicedCells + realSlice.Size; //task = Task.Factory.StartNew(() => GenerateAllPossibleSlicingLayouts( pizzaCloned, possibleSlices, successfulSlicesCloned, totalSlicedCellsCloned, nextPossibilityIndex); //); } }); } if (totalSlicedCells > _theUltimateSlice.TotalSlicedCells) { _theUltimateSlice = new SlicingAttempts( (char[, ])pizza.Content.Clone(), successfulSlices, totalSlicedCells); var sliceSummary = $"Retrieved slicing layout, Successful Slices: {successfulSlices.Count}, Total Sliced Cells: {totalSlicedCells}"; Console.WriteLine(sliceSummary); OnUltimateSliceChanged(); File.AppendAllText(Path.Combine(_directoryForOutput, "out.txt"), sliceSummary + Environment.NewLine); } }
private static void SlicingUltimate(Pizza pizza) { RedWriteLine("Starting the ULTIMATE pizza slicing.. Should retrieve all possible slicing layout(s)!"); var possibleSlices = new List <PossibleSlices>(); //_allProbableSlicingAttemptsCount = 1; var sizesPossibleSlice = GetPossibleSliceDimensions(pizza.CellsMinInSlice, pizza.CellsMaxInSlice); //looking into all valid slices from every single cell in the pizza Console.WriteLine("Getting all valid slices from every single cell in the pizza.."); for (var row = 0; row < pizza.RowsPizzaCount; row++) { for (var column = 0; column < pizza.ColumnsPizzaCount; column++) { var startPointSlice = new Point(row, column); var slicesValid = new List <SlicePizza>(); foreach (var sizeSlice in sizesPossibleSlice) { var quadDirectionsEndPoints = GetPossibleQuadDirectionalEndPoints( row, column, pizza.RowsPizzaCount, pizza.ColumnsPizzaCount, sizeSlice); slicesValid.AddRange(GetAllPossibleSliceForAnOrigin(pizza, quadDirectionsEndPoints, startPointSlice)); } if (slicesValid.Count > 0) { possibleSlices.Add(new PossibleSlices(startPointSlice, slicesValid)); } } } Console.WriteLine( $"All cells with valid slices originated at them: {possibleSlices.Count}"); RedWriteLine("Starting generating all possible slicing layouts.."); _theUltimateSlice = new SlicingAttempts(pizza); UltimateSliceChangedEvent += UltimateSliceChanged_EventHandler; GenerateAllPossibleSlicingLayouts( pizza.Clone(), possibleSlices, new List <SlicePizza>(), 0, 0); Console.WriteLine(); Console.WriteLine("<-----~-----+- FINISHED -+-----~----->"); Console.ReadLine(); }