Ermitteln der optimalen Kachelungsstrategie mit Quadraten unterschiedlicher Größe

8

Ich habe Formen aus 8x8 Quadraten. Ich muss sie mit der kleinsten Anzahl von Quadraten der Größe 8x8, 16x16, 32x32 und 64x64 kacheln. Vier 8 × 8-Quadrate, die in einem Quadrat angeordnet sind, können durch ein einzelnes 16 × 16-Quadrat ersetzt werden, z. B .:

Welcher Algorithmus kann dazu verwendet werden?

    
Simononon 13.01.2011, 09:50
quelle

2 Antworten

3

Dies erfordert eine dynamische Programmierlösung. Ich nehme an, wir haben ein square[r][c] Array von booleschen Werten, was wahr ist, wenn (r, c) ein 1x1 Quadrat hat (Ich habe die Lösung vereinfacht, um mit 1x1, 2x2, 4x4 und 8x8 Quadraten zu arbeiten, um es einfacher zu machen, aber es ist leicht anzupassen). Pad es mit einer Wand von false Sentinel-Werte in der oberen Zeile und linke Spalte.

Definieren Sie ein zweidimensionales count -Array, wobei count[r][c] sich auf die Anzahl der 1x1-Quadrate in der Region oberhalb und links von (r, c) bezieht. Wir können sie mit einem dp-Algorithmus addieren:

%Vor%

Das obige funktioniert, indem wir zwei Regionen addieren, von denen wir bereits die Summe kennen, die doppelt gezählte Fläche subtrahieren und die neue Zelle hinzufügen. Mit dem count -Array können wir testen, ob eine quadratische Region vollständig in 1x1-Quadrate in konstanter Zeit mit einer ähnlichen Methode abgedeckt ist:

%Vor%

Wir erstellen dann ein zweites 2d min_squares -Array, wobei min_squares[r][c] sich auf die minimale Anzahl von Quadraten bezieht, die benötigt werden, um die ursprünglichen 1x1-Quadrate abzudecken. Diese Werte können mit einem anderen dp berechnet werden:

%Vor%

Um das Kacheln zu rekonstruieren, das benötigt wird, um das berechnete Minimum zu erhalten, verwenden wir ein Hilfsfeld size_used[r][c] , mit dem wir die Größe des auf (r, c) platzierten Quadrats verfolgen können. Daraus können wir das Tiling rekursiv rekonstruieren:

%Vor%     
marcog 13.01.2011, 11:17
quelle
1

Sehen Sie sich vielleicht Optimaler Weg, um eine zellbasierte Form in eine minimale Anzahl von Rechtecken zu partitionieren - wenn ich das richtig verstanden habe, ist das das gleiche Problem, aber für Rechtecke anstelle von Quadraten.

    
Shadikka 13.01.2011 09:58
quelle

Tags und Links