示例#1
0
        public static bool SetsAreEqual(VakjeSetDeluxe set1, VakjeSetDeluxe set2)
        {
            if (set1.Vakjes.Count != set2.Vakjes.Count)
            {
                return(false);
            }

            //if (set1.MinCountGuaranteedBombs != set2.MinCountGuaranteedBombs)
            //{
            //    return false;
            //}

            //if (set1.MinCountGuaranteedNotBombs != set2.MinCountGuaranteedNotBombs)
            //{
            //    return false;
            //}

            var intersection = set1.Vakjes.Intersect(set2.Vakjes);

            if (intersection.Count() != set1.Vakjes.Count)
            {
                return(false);
            }
            return(true);
        }
        private static bool AddSetDeluxe(List <VakjeSetDeluxe> alleSets, BommenBepalerStatsIteratie iteratie, int minCountBommen, int minCountNietBommen, List <Vakje> vakjes)
        {
            var newSet = new VakjeSetDeluxe(minCountBommen, minCountNietBommen, vakjes);

            var matchingSets = alleSets.Where(t => SetComparer.SetsAreEqual(newSet, t)).ToList();

            if (matchingSets.Count > 1)
            {
                throw new InvalidOperationException("Should never happen");
            }
            else if (matchingSets.Count == 0)
            {
                alleSets.Add(newSet);
                foreach (var unrevealed in vakjes)
                {
                    unrevealed.VakjeBerekeningen.SetsDeluxe.Add(newSet);
                }
                return(true);
            }
            else
            {
                var  setExisting = matchingSets.First();
                bool changed     = false;

                var newMinGuaranteed    = Math.Max(setExisting.MinCountGuaranteedBombs, newSet.MinCountGuaranteedBombs);
                var newMinGuaranteedNot = Math.Max(setExisting.MinCountGuaranteedNotBombs, newSet.MinCountGuaranteedNotBombs);

                if (setExisting.MinCountGuaranteedBombs != newMinGuaranteed)
                {
                    changed = true;
                    setExisting.MinCountGuaranteedBombs = newMinGuaranteed;
                }

                if (setExisting.MinCountGuaranteedNotBombs != newMinGuaranteedNot)
                {
                    changed = true;
                    setExisting.MinCountGuaranteedNotBombs = newMinGuaranteedNot;
                }

                if (setExisting.MinCountGuaranteedBombs + setExisting.MinCountGuaranteedNotBombs > setExisting.Vakjes.Count)
                {
                    throw new InvalidOperationException("Dit kan ook niet");
                }
                return(changed);
            }
        }
        public void FindsSetsWithGuaranteedBombs()
        {
            var logger = DefaultLoggerFactory.CreateLoggerForTests();



            var vakjeLinksBoven  = new Vakje('.', 0, 0);
            var vakjeRechtsBoven = new Vakje('.', 1, 0);
            var vakjeLinks       = new Vakje('.', 0, 1);
            var vakjeRechts      = new Vakje('.', 1, 1);
            var vakjeLinksOnder  = new Vakje('.', 0, 2);
            var vakjeRechtsOnder = new Vakje('.', 1, 2);

            var alleVakjes = new List <Vakje>()
            {
                vakjeLinksBoven, vakjeRechtsBoven, vakjeRechts, vakjeRechtsOnder, vakjeLinksOnder, vakjeLinks
            };
            var overallSet = new VakjeSetDeluxe(0, 0, alleVakjes);

            //Set1 groen linksboven
            var set1 = new VakjeSetDeluxe(0, 0, new List <Vakje>()
            {
                vakjeLinks, vakjeLinksBoven
            });

            //Set2 rood top
            var set2 = new VakjeSetDeluxe(0, 0, new List <Vakje>()
            {
                vakjeLinksBoven, vakjeRechtsBoven
            });

            //Set3 Rood rechts (3 set)
            var set3 = new VakjeSetDeluxe(0, 0, new List <Vakje>()
            {
                vakjeRechtsBoven, vakjeRechts, vakjeRechtsOnder
            });

            //Set4 Blauw rechtsboven
            var set4 = new VakjeSetDeluxe(0, 0, new List <Vakje>()
            {
                vakjeRechtsBoven, vakjeRechts
            });

            //Set5 Blauw onder
            var set5 = new VakjeSetDeluxe(0, 0, new List <Vakje>()
            {
                vakjeLinksOnder, vakjeRechtsOnder
            });

            //Set6 Rood linksonder (Enkel)
            var set6 = new VakjeSetDeluxe(0, 0, new List <Vakje>()
            {
                vakjeLinksOnder
            });

            //Set7 Blauw links (Enkel)
            var set7 = new VakjeSetDeluxe(0, 0, new List <Vakje>()
            {
                vakjeLinks
            });

            var alleSets = new List <VakjeSetDeluxe>()
            {
                set1,
                set2,
                set3,
                set4,
                set5,
                set6,
                set7
            };

            var result = SetBepaler.BepaalSetsThatFillMeCompletely(overallSet, alleSets);

            Assert.Equal(2, result.Count);
        }
        public static BommenBepalerStatsIteratie BepaalBommen2(Vakje[,] deVakjesArray, int width, int height, BotConfig botConfig)
        {
            var iteratie = new BommenBepalerStatsIteratie();

            var flatVakjes = TwoDimensionalArrayHelper.Flatten(deVakjesArray).Where(t => t != null);
            var allSets    = flatVakjes.SelectMany(t => t.VakjeBerekeningen.SetsDeluxe).Distinct().ToList();


            var setsToAdd = new List <VakjeSetDeluxe>();

            foreach (var set in allSets)
            {
                var alleOverlappendeSets = set.Vakjes.SelectMany(t => t.VakjeBerekeningen.SetsDeluxe).Distinct().ToList();

                var filledIntersections = SetBepaler.BepaalSetsThatFillMeCompletely(set, alleOverlappendeSets);

                foreach (var filledIntersection in filledIntersections)
                {
                    var totGuaranteedNotBombs = filledIntersection.Sum(t => t.MinCountGuaranteedNotBombsInIntersection);
                    if (totGuaranteedNotBombs == set.Vakjes.Count - set.MinCountGuaranteedBombs)
                    {
                        //Shouldn't be required but we're now sure that the max count of bombs here is in fact this
                        //set.MinCountGuaranteedNotBombs = Math.Min(set.Vakjes.Count - set.MinCountGuaranteedBombs, set.MinCountGuaranteedNotBombs);

                        foreach (var intersectionSet in filledIntersection)
                        {
                            var guaranteedBommenHier = intersectionSet.Intersection.Count - intersectionSet.MinCountGuaranteedNotBombsInIntersection;
                            var newSet = new VakjeSetDeluxe(guaranteedBommenHier, intersectionSet.MinCountGuaranteedNotBombsInIntersection, intersectionSet.Intersection);
                            setsToAdd.Add(newSet);
                        }
                    }
                }

                var notCompletelyFilledIntersections = SetBepaler.BepaalSetsThatDontFillMeCompletely(set, alleOverlappendeSets);


                foreach (var notCompletelyFilledIntersection in notCompletelyFilledIntersections)
                {
                    var maxBommen = set.Vakjes.Count - set.MinCountGuaranteedNotBombs;

                    var bommenInTheseIntersections = notCompletelyFilledIntersection.Sum(t => t.MinCountGuaranteedBombsInIntersection);
                    if (bommenInTheseIntersections == maxBommen)
                    {
                        var vakjesOver = set.Vakjes.Except(notCompletelyFilledIntersection.SelectMany(t => t.VakjeSetDeluxe.Vakjes)).ToList();
                        if (vakjesOver.Count > 0)
                        {
                            //Heeft alleen zin als er dus echt nog een set is met vakjes die dus als niet bomb kunnen worden gemarkeerd
                            var newSet = new VakjeSetDeluxe(0, vakjesOver.Count, vakjesOver);
                            setsToAdd.Add(newSet);
                        }
                    }


                    var guaranteedNotBombs = notCompletelyFilledIntersection.Sum(t => t.MinCountGuaranteedNotBombsInIntersection);

                    if (set.Vakjes.Count - set.MinCountGuaranteedBombs == guaranteedNotBombs)
                    {
                        var vakjesOver = set.Vakjes.Except(notCompletelyFilledIntersection.SelectMany(t => t.VakjeSetDeluxe.Vakjes)).ToList();
                        if (vakjesOver.Count > 0)
                        {
                            //Heeft alleen zin als er dus echt nog een set is met vakjes die dus als bomb kunnen worden gemarkeerd
                            var newSet = new VakjeSetDeluxe(vakjesOver.Count, 0, vakjesOver);
                            setsToAdd.Add(newSet);
                        }
                    }

                    //var theRest = filledIntersection.Except(new List<IntersectionAndSet>() { intersectionSet }).ToList();
                    //if (set.Vakjes.Count - set.MinCountGuaranteedNotBombs == intersectionSet.MinCountGuaranteedBombsInIntersection)
                    //{
                    //    var vakjesOfTheRest = theRest.SelectMany(t => t.VakjeSetDeluxe.Vakjes).ToList();
                    //    var newSet = new VakjeSetDeluxe(0, vakjesOfTheRest.Count, vakjesOfTheRest);
                    //    setsToAdd.Add(newSet);
                    //}
                }
            }


            foreach (var newSet in setsToAdd)
            {
                var changed = AddSetDeluxe(allSets, iteratie, newSet.MinCountGuaranteedBombs, newSet.MinCountGuaranteedNotBombs, newSet.Vakjes);
                if (changed)
                {
                    //Debug.WriteLine("Added set");
                    iteratie.Vondsten.Add(new BommenBepalerStatsIteratieVondst(iteratie, newSet.Vakjes.First(), VondstType.SetsBasedGuaranteedBomb));
                }
            }
            return(iteratie);
        }
        private static List <List <IntersectionAndSet> > BepaalSetsThatDontFillMeCompletely(VakjeSetDeluxe deOverallSet, List <VakjeSetDeluxe> lijstMetAlleSets, List <IntersectionAndSet> current)
        {
            if (current.SelectMany(t => t.Intersection).Count() == deOverallSet.Vakjes.Count)
            {
                return(new List <List <IntersectionAndSet> >()
                {
                    current
                });
            }

            var allItems = new List <List <IntersectionAndSet> >();

            allItems.Add(current);
            foreach (var set in lijstMetAlleSets)
            {
                if (set != deOverallSet)
                {
                    var intersection    = deOverallSet.Vakjes.Intersect(set.Vakjes).ToList();
                    var vrijeVakjesOver = deOverallSet.Vakjes.Except(current.SelectMany(t => t.VakjeSetDeluxe.Vakjes)).ToList();

                    if (vrijeVakjesOver.Intersect(intersection).Count() == intersection.Count)
                    {
                        //Hij past er nog in
                        var clone = current.ToList();
                        clone.Add(new IntersectionAndSet(intersection, set));
                        var foundItems = BepaalSetsThatDontFillMeCompletely(deOverallSet, lijstMetAlleSets, clone);
                        allItems.AddRange(foundItems);
                    }
                }
            }
            return(allItems);
        }
        public static List <List <IntersectionAndSet> > BepaalSetsThatDontFillMeCompletely(VakjeSetDeluxe deOverallSet, List <VakjeSetDeluxe> lijstMetAlleSets)
        {
            var foundItems = BepaalSetsThatDontFillMeCompletely(deOverallSet, lijstMetAlleSets, new List <IntersectionAndSet>());
            var result     = EnsureNoDuplicates(foundItems);

            return(result);
        }