Useful Algorithms
Useful Algorithms
Basic functions
These basic function are used to in the following algorithms. Capitals are sets of points and lowercase are single points
- R = X & Y — R contains points that are in both X and Y
 - 
    
R = X Y — R contains points that are in either X or Y  - R = X - Y — R contains points that are in X but not in Y (same as R = X & ~Y)
 - R = ~X — R contains points that are not in X
 - R = X.Border — R contains points that are adjacent to points in X
 - R = X.Grow — R contains points in X and X.boarder
 - R = X.Shrink — R contains points that are completely surrounded by points in X (same as R = X - (~X).Border)
 - X[x] — returns true if X contains x
 - X.Agj(x) — (X.Border)[x]
 - X.empty — returns true if no stones in X
 - X.any — returns true is there are any stones in X
 
Groups
There are a couple ways to find groups. The fastest is to keep track of groups as you add stones to the board. The other is to generate a set of points that is the group from a given stone.
- Each time a stone is added first test if it touches any stones of the same colour. If it does then have it join that group. If it touches more than one you will have to merge those groups together. If it doesn’t touch any then it becomes a new group on it’s own.
 - Here is a function that returns a point set (PS) that is the group from a location and a point set that represents all points of that colour
 
PS Group (x,X)
  PS R,T         //start empty
  T.Add(x)       //add x to the point set T
  while R NOT= T //Grows until it fills the group
    R = T
    T = T.Grow
    T = T & X
  return R
Liberties
PS Libs (X, Y) //returns liberties points of X.  X is player stones Y is opponent stones
  return (X.Border - Y)
Benson’s Algorithm : Pass Alive Groups
A chain (c) is a group of points of the player’s stones and a region (r) is a group of points of either empty or opponent’s stones. A chain is pass alive if it touches at least 2 safe regions whose empty points are liberties of the chain. A region is safe if it completely surrounded by pass alive chains.
//Starting with an array of chains and regions
//Every stone player stone is in exactly one chain
//Every empty point and opponent stone is in exactly one region
for each Region in Regions            //Iterate through each Region
  if (Region.Shrink & empty).Any      //If there are any interior empty spaces
    delete Region                     //Then remove the group from the list
loop                                  //Loop though chains and regions removing unsafe ones until no more to remove
  for each Chain in Chains            //Iterate through each Chain
    int count = 0
    for each Region in Regions
      if (Chain.Border & Region).Any  //If touching a safe region
        count++                       //Increment count
    if count < 2                      //If not touching 2 safe regions
      delete Chain                    //remove the chain from the list
  PS Temp
  for each Chain in Chains
    Temp = Temp | Chain               //Create a Point Set that is all the safe chains
  for each Region in Regions
    if (Region.Border - Chain).Any    //If any point bordering the region is not in a safe chain
      delete Region                   //Region isn't safe so remove it