2012-04-28 6 views
5

Es gibt eine N x M Platine, die wir malen sollten. Wir können entweder eine ganze Zeile oder eine ganze Spalte gleichzeitig malen. Angesichts einer N x M Matrix von Farben aller Board-Zellen finden Sie die minimale Anzahl von Maloperationen, um die Platine zu malen.Programmierung Puzzle: Wie ein Brett zu malen?

Zum Beispiel: sollten wir malen eine 3 x 3 Board wie folgt (R - rot, B - blau, G - grün):

B, B, B
B, R, R
B , G, G

Die minimale Anzahl von Lackierarbeiten 4:

  • Lack Zeile 0 mit Blue
  • Lackreihe 1 mit Red
  • Lackreihe 2 mit Green
  • Lacksäule 0 mit Blue

Wie würden Sie es lösen?

+0

Können Sie mehr Hintergrund geben? Vor allem was ist die erwartete Boardgröße? Welche Komplexität erwarten Sie? – amit

+0

@amit Ja, Sie haben Recht. Die Platte ist höchstens 50 x 50 und die Anzahl der Farben ist höchstens 10. – Michael

+0

Etwas sollte über Machbarkeit gesagt werden. Offensichtlich können Bretter ohne eine einzelne Reihe oder Spalte mit der gleichen Farbe überall nicht gelöst werden. – flodel

Antwort

3

Für den Anfang können Sie versuchen, eine informierte erschöpfende Suche.

Lassen Sie Ihre Staaten Grafik sein: wo V = {all possible boards} und E = {(u,v) | you can move from board u to v within a single operation}.

  • Beachten Sie, dass Sie nicht brauchen, die Grafik im Voraus zu erzeugen - Sie können es on the fly erzeugen kann, mit einer successors(board) Funktion, die alle Nachfolger des gegebenen Bord zurückzukehren.

Sie müssen auch h:V->R - eine admissible heuristic function, die das Board auswertet.

Jetzt können Sie A* oder bi-directional BFS-Suche [oder Kombination von beiden] ausführen, Ihre Quelle wird eine weiße Tafel sein, und Ihr Ziel ist die angeforderte Platine. Da wir die zulässige heuristische Funktion verwenden - A * ist sowohl complete (findet immer eine Lösung, wenn eine existiert) und optimal (findet die kürzeste Lösung), wird es die beste Lösung finden. [Gleiches gilt für bidirektionales BFS].

Nachteile:

  • Obwohl der Algorithmus informiert wird, wird es exponentielles Verhalten haben. Aber wenn es eine Interviewfrage ist, glaube ich, dass eine nicht effiziente Lösung besser als keine Lösung ist.
  • Obwohl vollständig und optimal - wenn es keine Lösung gibt - kann der Algorithmus in einer Endlosschleife oder zumindest einer sehr langen Schleife stecken bleiben, bis er erkennt, dass er alle Möglichkeiten ausgeschöpft hat.

(1) Beispiel für zulässige Heuristik ist h(board) = #(miscolored_squares)/max{m,n}

6

Dieses wie ein Spaß Problem sieht. Lass es mich mit einem Pseudocode aufnehmen.

Function MinPaints(Matrix) Returns Integer 
    If the matrix is empty return 0 
    Find all rows and columns which have a single color 
    If there are none, return infinity, since there is no solution 
    Set the current minimum to infinity 
    For each row or column with single color: 
     Remove the row/column from the matrix 
     Call MinPaints with the new matrix 
     If the result is less than the current minimum, set the current minimum to the result 
    End loop 
    Return the current minimum + 1 
End Function 

Ich denke, das wird Ihr Problem lösen, aber ich habe keine Optimierung oder irgendetwas versucht. Das ist vielleicht nicht schnell genug, ich weiß es nicht. Ich bezweifle, dass dieses Problem in subexponentieller Zeit lösbar ist.

Hier ist, wie dieser Algorithmus das Beispiel lösen würde:

BBB 
BRR 
BGG 
| 
+---BRR 
| BGG 
| | 
| +---RR 
| | GG 
| | | 
| | +---GG 
| | | | 
| | | +---[] 
| | | | | 
| | | | Solvable in 0 
| | | | 
| | | Solvable in 1 
| | | 
| | +---RR 
| | | | 
| | | +---[] 
| | | | | 
| | | | Solvable in 0 
| | | | 
| | | Solvable in 1 
| | | 
| | Solvable in 2 
| | 
| Solvable in 3 
|      BB 
+---Another branch with RR ... 
|      GG 
Solvable in 4 
+0

'Wenn das Ergebnis -1 ist, gebe -1 zurück 'Ich bin mir nicht sicher, ob das richtig ist, es bedeutet nur, dass dieser spezielle Zweig zu keiner Lösung führt, aber möglicherweise einen anderen Zweig (der später in der for-Schleife entdeckt wird) was zu einer korrekten Lösung führt. [Es kann gelöst werden, indem man INFINITY zurückgibt, wenn es keine Lösung gibt, und es wie jedes andere Ergebnis behandelt] – amit

+0

Sie mögen Recht haben, aber ich kann nicht herausfinden, wie diese Situation aussehen würde. Ich habe das Gefühl, dass es nicht geht. –

+0

Könnte sein, aber zumindest - die INFINITY-Lösung ist eleganter, weil sie weniger Spezialfälle erfordert, IMO :) – amit