void GoSafetySolver::GenBlocksRegions() { if (UpToDate()) /* */ return; /* */ GoStaticSafetySolver::GenBlocksRegions(); Regions()->GenChains(); // merge blocks adjacent to 1-vital with 2 conn. points for (SgBWIterator it; it; ++it) { SgBlackWhite color(*it); for (SgVectorIteratorOf<GoRegion> it(Regions()->AllRegions(color)); it; ++it) { GoRegion* r = *it; r->ComputeFlag(GO_REGION_STATIC_1VITAL); } bool changed = true; while (changed) { changed = false; for (SgVectorIteratorOf<GoRegion> it(Regions()->AllRegions(color)); it; ++it) { GoRegion* r = *it; if ( r->GetFlag(GO_REGION_STATIC_1VC) && r->Chains().IsLength(2) && r->Has2Conn() // || r->Safe2Cuts(Board()) changed from && to || // @todo does not work if blocks are already chains??? // must explicitly keep chain libs info. ) // easy case of only 2 chains { GoChain* c1 = r->Chains().Front(); GoChain* c2 = r->Chains().Back(); Merge(c1, c2, r, false); // false = not by search changed = true; break; // to leave iteration } else if ( r->GetFlag(GO_REGION_STATIC_1VITAL) && r->GetFlag(GO_REGION_CORRIDOR) && ! r->GetFlag(GO_REGION_USED_FOR_MERGE) ) { GoChain* c1 = 0; GoChain* c2 = 0; if (r->Find2Mergable(&c1, &c2)) { Merge(c1, c2, r, false); changed = true; break; // to leave iteration } } } } } m_code = Board().GetHashCode(); }
bool GoSafetySolver::FindSurroundedSingleRegion(SgBWSet* safe, SgBlackWhite color) { SgPointSet anySafe(safe->Both()); for (SgVectorIteratorOf<GoRegion> it(Regions()->AllRegions(color)); it; ++it) { GoRegion* r = *it; if ( ! r->GetFlag(GO_REGION_SAFE) && r->SomeBlockIsSafe() && ! r->Points().Overlaps(anySafe) && GoSafetyUtil::ExtendedIsTerritory(Board(), Regions(), r->PointsPlusInteriorBlocks(), (*safe)[color], color) ) { GoSafetyUtil::AddToSafe(Board(), r->Points(), color, safe, "surr-safe-1", 0, true); Regions()->SetSafeFlags(*safe); return true; } } return false; }
bool GoSafetySolver::RegionHealthyForBlock(const GoRegion& r, const GoBlock& b) const { return GoStaticSafetySolver::RegionHealthyForBlock(r, b) || r.GetFlag(GO_REGION_STATIC_1VITAL); }