Aunque no se trata tanto de una solución matemática como de una solución de software, voy a añadirla de todos modos, aunque sólo sea por la bonita imagen del final.
El proceso utilizado para encontrar todas las cuadrículas es el siguiente.
En primer lugar, a cada una de las casillas de la cuadrícula de 3x3 se le asigna un índice de 1 a 9 en función de la coordenada ( $n=3(y-1)+x$ ), donde $(1,1)$ es la parte superior izquierda y $(3,3)$ es de abajo a la derecha. Este número representa el índice más alto de un panel que puede cubrirlo.
Esencialmente, esto significa que los paneles deben crecer desde cualquier cuadrado hacia la derecha y hacia abajo. Esta limitación evita las entradas duplicadas: cada panel que crece hacia la derecha y hacia abajo es idéntico a uno que crece hacia la izquierda y hacia arriba.
La tarea consiste entonces en construir simplemente una lista de posibles rejillas añadiendo paneles. Los paneles utilizan un enfoque recursivo que abandona todas las cuadrículas que sólo podrían ser cubiertas tienen más de un panel con el mismo índice, evitando así las cuadrículas duplicadas.
Para quien esté interesado en ver el código MATLAB que enumera todas las cuadrículas, lo he incluido al final de la respuesta.
Es impresionante lo rápido que crece el número de cuadrículas posibles.
Para una cuadrícula de 3x3 tenemos las 322 posibilidades identificadas por las otras respuestas. Si pasamos a 4x4 tenemos 70878 cuadrículas posibles. Si pasamos a una cuadrícula de dos páginas de 3x6, el número aumenta a la friolera de 314662 cuadrículas posibles.
Una vez construidas todas las cuadrículas posibles, sólo tiene sentido exportarlas en algo bonito. A continuación se muestran todas las cuadrículas en mosaico y convertidas en una imagen combinada de todos los 322 posibles rejillas. En la imagen, el color de un panel representa el índice del cuadrado superior izquierdo de ese panel.
Las cuadrículas están ordenadas en el orden en que se encontraron, que es esencialmente el de empezar con un cuadrado sólido y luego trabajar hacia atrás desde la esquina inferior derecha.
Las siguientes funciones de MATLAB se utilizan para producir las mallas.
function [found] = makeGrids(found,grid,depth,x,y)
if (depth > (x*y))
%If at max depth then grid is valid.
found = [found grid]; %So add to list
disp(grid)
%found=found+1; %So one more found
else
%Show current depth and found count during search.
if (depth<=(x*(y-1)))
disp([repmat('..> ',1,depth) num2str(depth) ' (found:' num2str(numel(found)) ')']);
end
%Another layer to do
for k=1:depth
%For each number in this layer
grid(depth)=k; %Update grid with new number. Depth is linear index
%Now we check to see if the current state of the grid is
%acceptable (if it isn't then no lower down ones possibly can)
if (checkPanels(grid,depth,x,y)) %If it is acceptable (i.e. there are no remaining values with no frame)
found=makeGrids(found,grid,depth+1,x,y); %Work through the next layer
end
end
end
end
function success = checkPanels(grid,depth,x,y)
success = false;
for ys=1:y
for xs=1:x
%Start at (1,1) and work through to (n,n)
expected = xs+(ys-1)*x; %Linear index of this cell
if(expected > depth)
%If the expected val is more than current depth
return; %Then we are done searching
end
panelFound=false;
for xe=x:-1:xs
for ye=y:-1:ys
%For each end value starting from largest to smallest
panel=grid(xs:xe,ys:ye); %Extract the current panel
panel(panel==expected)=0; %Cover all instances of expected value in panel
panelFound = all(all(~panel));%Check if every number in this panel is covered
if (panelFound) %If we have found a complete panel
grid(xs:xe,ys:ye) = -1; %then mark panel a covered in the grid.
break; %We can only have one panel for any given number, so break.
end
end
if (panelFound)
break; %We can only have one panel for any given number, so continue break.
end
end
%Check if entire grid is covered
if (all(all(grid==-1)))
success = true; %Grid is all covered and valid
return;
end
end
end
end
A continuación se utiliza el siguiente script para llamar a la función y crear la imagen en mosaico (aunque yo he añadido los bordes con detección de bordes en Photoshop)
%Grid Size
x=3; %3x3
y=3;
%Enumerate all grids
grids=makeGrids({},zeros(x,y),1,x,y);
gridCount = numel(grids);
disp(['Grids Found: ' num2str(gridCount)]);
%Colour mapping for image - hot(x*y), hsv(x*y) and jet(x*y) all look good
map=[jet(x*y);0,0,0]; %;0,0,0 is for black borderd
%Create images for all grids
nameFormat = ['%0' num2str(ceil(log10(gridCount))) 'd'];
for i=1:gridCount
img=grids{i};
img(x+1,:)=(x*y)+1;
img(:,y+1)=(x*y)+1;
[img, newmap]=imresize(img,map,32,'nearest');
imwrite(ind2rgb(img,newmap),['Grid' num2str(i,nameFormat) '.png']);
end
%Create tiled montage of images
dirOutput = dir('Grid*.png');
fileNames = {dirOutput.name}';
vertical = max(factor(gridCount));
horizontal = gridCount/vertical;
montage(fileNames, 'Size', [vertical horizontal]);
%And save montage as PNG.
allGrids=getframe(gca);
imwrite(allGrids.cdata,'AllGrids.png');
0 votos
¿Quiere enumerar las 4096 posibilidades? Si es así, etiqueta los bordes interiores como 1, ..., 12. Escriba los números del 0 al 4095 en binario con ceros a la izquierda para dar una longitud coherente. Incluya el borde 1 si el bit 1 es 1, incluya el borde 2 si el bit 2 es 1, etc. El 0 le dará ningún borde interno y por lo tanto una región de 9x9. 4095 le dará todos los bordes internos y por lo tanto 9 regiones de 1x1.
15 votos
Las 4096 vías también incluyen todo tipo de paneles no rectangulares. (Piensa en los bloques del Tetris, si quieres una imagen) Naturalmente hay más de ellos, entonces si sólo permites rectángulos. Sin embargo, tus 96 combinaciones probablemente también están fuera de lugar, ya que cuentas de más algunas simétricas y dejas fuera otras como un único panel grande.
0 votos
No creo que todas las 4096 posibilidades funcionen, por ejemplo, especialmente porque estamos restringiendo cada panel a un rectángulo.
8 votos
No todas las 4096 combinaciones de segmentos de borde tienen sentido; ¿cómo tendría sentido un panel con sólo 1 de 12 segmentos de borde? Además, cada uno de los grupos debe ser un rectángulo, ¿o también se permiten paneles no rectangulares? Para empezar, hay 127 paneles diferentes que utilizan sólo bloques de 1x1 y 2x2, por lo que en su imagen falta un montón de paneles.
3 votos
@Servaes ¿Te refieres a 1x1 y 2x1 ¿en lugar de 2x2 para este último?
1 votos
@pjs Sí, gracias por la corrección. Lamentablemente ya no puedo editar el comentario.