anchor.diff:          return (point.x == x &&
               point.y == y);
       }
  +}
  +
  +class DisJointPoints {
  +    Map<Point, int> set = new Map<Point, int>();
  +
  +    void operator[]=(Point key, int value){
  +        set[key] = value;
  +    }
  +
  +    int operator[](Point key){
  +        return findGroup(key);
  +    }
  +
  +    Point find(Point point){
  +        if(point.parent == point){
  +            return point;
  +        } else {
  +            return find(point.parent);
  +        }
  +    }
  +
  +    int findGroup(Point point){
  +        return set[find(point)];
  +    }
  +
  +    void union(Point a, Point b){
  +        Point aRoot = find(a);
  +        Point bRoot = find(b);
  +        aRoot.parent = bRoot;
  +    }
  +
   }
   
   
  
positive.code:                     labels[cp] = minLabel;
  
                      //update equivs
                      equivs[northLabel].union(equivs[westLabel]);
                      equivs[westLabel].union(equivs[northLabel]);
                  }
  
negative.code: Map<int, Set<Point>> connectedColors(List<List<Cell>> board){
      Map<int, Set<Point>> blobs = new Map<int, Set<Point>>();
      Map<int, Set<int>> equivs = new Map<int, Set<int>>();
      DisJointPoints labels = new DisJointPoints();
      int labelIndex = 0;
      //TODO scan map, build blob and equivalency list
      //first pass
  