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