enumerate all possible reachable states to check if any have none of any colour, like so:
from itertools import product
class Board:
def __init__(self, state):
self.state = [r[:] for r in state]
def r(self, i):
self.state[i] = [(v+1)%3 for v in self.state[i]]
def c(self, i):
for row in self.state:
row[i] = (row[i]+1)%3
def __repr__(self):
return '\n'.join(' '.join(str(v) for v in row) for row in self.state)
def clear(board):
b = Board(board.state)
for presses in product((0,1,2), repeat=9):
b.state = [r[:] for r in board.state]
for i, p in enumerate(presses[:5]):
for n in range(p):
b.r(i)
for i, p in enumerate(presses[5:]):
for n in range(p):
b.c(i)
if not all(any(v in r for r in b.state) for v in (0,1,2)):
return presses
>>> board = Board([[0,0,0,0,0],[0,0,0,0,0],[1,1,0,2,0],[0,1,1,1,0],[0,0,1,0,0]])
>>>clear(board) is None
True
>>>
>>> board = Board([[0,0,0,0,0],[0,1,2,0,0],[0,0,0,0,1],[0,0,0,0,0],[1,1,1,0,0]])
>>>clear(board) is None
True
>>>
>>> board = Board([[2,0,1,0,0],[0,2,0,0,0],[0,1,0,0,0],[0,0,0,0,0],[0,0,0,0,0]])
>>>clear(board) is None
True
>>>