Explicação legal: O intuito desse algoritimo é gerar, nesse caso, uma matriz de forma procedural, isto é, respeitando as limitações de cada célula.
Passo 1
Escolher uma célula aleatória da matriz e sortear um valor para ela pois devemos começar de algum lugar e até o momento não temos restrições
Passo 2
Atualiazar cada célula não preenchida da matriz com base nas células adjacentes à ela, modificando a lista das possíveis formas que aquela célula pode tomar, e anotando o número de diferentes formas que ela pode tomar.
Passo 3
Descobrir qual é a célula da matriz que está mais restrita, com o menor número de formas possíveis, e sortear uma forma aleatória. (Caso houver empate para a célula mais restrita, haverá sorteio)