Como classificar cores em duas dimensões?

Atualmente, estou trabalhando em um projeto de hobby para resolver automaticamente um quebra-cabeça do popular jogo para celularEu amo a matiz. O jogo está disponívelaqui.

Basicamente, toda a premissa do jogo é que você recebe um monte de blocos retangulares coloridos organizados em uma grade. Você pode trocar a maioria dos blocos, exceto alguns blocos fixos, marcados por pontos pretos. O objetivo do jogo é trocar os blocos para obter um espectro bidimensional de cores. As cores são classificadas de forma que a cor de cada bloco seja aproximadamente a média das cores ao seu redor. (Desculpe, não conheço nenhuma teoria das cores, mas provavelmente há uma palavra para o que estou procurando.) Veja como é um quebra-cabeça típico:

Já consegui tirar screenshots do adb, extrair a matriz RGB dos blocos e marcar quais blocos são "fixos". Estou tendo problemas com a parte algorítmica real desse problema.

Aqui está o que eu fiz até agora:

Convertendo o RGB em HSV e classificando as cores por matiz em uma lista unidimensional. Isso me dá um espectro, mas não sei como converter esse resultado em duas dimensões.Deixando as cores em RGB e tentando trabalhar com uma cor singular. Provavelmente há algum cálculo multivariável que eu poderia fazer aqui, mas a dificuldade está no fato de que algumas cores compartilham um ou mais de seus valores RGB. Seria necessário considerar todas as três cores.Usando a distância euclidiana para encontrar a distância entre cada par de cores. Entendo que o objetivo final é que essa distância seja a menor entre as cores adjacentes, mas a grade bidimensional está tornando isso mais difícil.Usando a distância euclidiana, desenvolvi uma métrica de quão ideal é uma determinada grade, observando a distância euclidiana das cores dos blocos adjacentes. No entanto, não consigo encontrar um algoritmo eficiente que possa descobrir as trocas necessárias para chegar a um estado ideal.

questionAnswers(2)

yourAnswerToTheQuestion