Deixe-me ver se eu entendi direito, os blocos marcados em vermelho eram azuis e o algoritmo encontrou uma forma de T e os marcou em vermelho, está correto? Seu objetivo é encontrar o maior número possível de formas em T com os mesmos blocos coloridos, correto até agora, espero. Atualmente, você os marca depois de encontrá-los e isso diminui a utilidade do algoritmo (já que você pode estar perdendo a solução ideal). Você planeja procurar todas as formas e depois escolher quais usar e qual não usar. Estou correto até agora? Porque você deseja maximizar a quantidade de blocos contidos nas formas T quando o algoritmo é concluído.
Se eu estiver correto, a seguir, é a solução ideal para sua situação na minha opinião.
Usaremos a Programação Linear Inteira.
Acredito que usei este no passado:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Você pode fazê-lo funcionar com muitas linguagens, eu usei com PHP, Java e C)
O que faremos é registrar todas as formas possíveis de T no quadro e usar o ILP para maximizar a quantidade de blocos cobertos. ILP é exponencialmente complexo. Considerando o tamanho da sua placa, isso não será um problema. Fiz perguntas min / max muito mais complicadas em gráficos com ILP e demorou apenas uma fração de segundo para concluir e de 30 a 90 segundos com centenas de vértices (no seu caso, cai na fração de segundo).
O que eu recomendaria fazer:
- Encontre todas as formas de linha possíveis
- Encontre todas as interseções entre formas de linha da mesma cor
- Encontre todas as formas possíveis de T, pesquisando todas as interseções.
- Defina uma variável booleana no Problema Linear para cada forma de T (
0 <= Bi <= 1
) Como os valores são números inteiros, isso deixa 0 ou 1.
- Faça as condições para cada par de formas T que se cruzam (
Bi + Bj <= 1
)
- A função objetivo será (soma dos blocos no formato "T" (i) * Bi)
- Execute o solucionador e obscureça as formas T onde os Booleanos correspondentes do solucionador estão 1 na solução ideal.
Este é um conhecimento valioso, usei resolvedores lineares frequentemente para projetos de trabalho.
O ILP é basicamente uma maneira de resolver problemas de seleção nos quais você deseja atingir um máximo ou um mínimo para alguma função linear.
Você pode ler mais aqui, usando Programação Linear Inteira e Programação Linear é a mesma para o programador, apenas que Integer é muito mais complexo para o computador, o que pode resultar em longos tempos de execução. Não no seu caso, é muito simples e, no pior dos casos, leva apenas menos de milissegundos.
Eu acho que você poderia ler mais aqui:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Isso explica bem:
http://fisher.osu.edu/~croxton_4/tutorial/
É basicamente um solucionador de problemas de decisão, como tomar decisões que maximizam o resultado desejado. Isso assume que a função que julga o resultado é linear e, no seu caso atual específico, é. A função que avalia o resultado nesse caso resume os blocos de todas as formas em T que você decidiu escurecer.
Matematicamente, como definir as variáveis: no nosso caso atual, os booleanos (escureci a forma de T com o índice i ou não) com os valores ótimos para maximizar o resultado que queremos: escurecendo o máximo de blocos possível sem escurecer as formas de interseção em T. Contanto que o resultado desejado possa ser calculado com uma função linear quando você tiver todas as variáveis definidas, ele o resolverá. No nosso caso, verificamos quais formas T escurecemos e somamos os blocos que cobrem.
Sei que isso não é trivial, portanto, se você optar por dar o salto, fique à vontade para comentar e eu o elaborarei.