Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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();
        }