/ / Korrekte Art, Kanten einer Matrix zu behandeln - c ++, Algorithmus, Matrix

Richtiger Umgang mit Kanten einer Matrix - C ++, Algorithmus, Matrix

Angenommen, wir müssen ein einfaches Programm schreiben, das eine Matrix transformiert. Jedes Element sollte die Summe seiner Nachbarelemente sein.

Was ist der "richtige" (d. H. Gebräuchlichste, beste Lesbarkeit, effektivste) Weg dies zu tun, wenn man die Kanten einer Matrix betrachtet?

Zwei offensichtliche Wege, dies zu erreichen, die mir einfallen:

  1. Behandle zuerst die Ecken (4 separate Linien), verwende 4 Schleifen, um die restlichen Kanten zu bearbeiten, und benutze dann die Standardschleife für den Rest
  2. Verwenden Sie eine Schleife für die gesamte Matrix mit if"s um zu überprüfen, ob wir in der Mitte sind oder es ist ein Randfall.

Der erste ist schneller (ich schätze), aber es schaut irgendwie zu mir aus, um 4 Zeilen plus 5 Loops dafür zu haben.

Gibt es einen eleganteren Weg? Ich habe dies als C ++ markiert, weil ich momentan in C ++ codiere und ich habe das Gefühl, dass der ternäre Operator ?: Es wird praktisch sein, eine nette Lösung zu schreiben.

Bonuspunkte, wenn Ihre Lösung optimiert werden kanneine komplexere Regel (nicht nur eine Zelle nach oben / rechts / links / unten schauen, aber wenn Sie eine bestimmte Art von Rekursion machen). Nicht sicher, ob es die Dinge viel ändern würde.

Antworten:

2 für die Antwort № 1

Ein eleganter Weg ist eine größere Matrix. Wenn Ihre Matrix NxM-Elemente hat, erstellen Sie eine temporäre (N + 2) x (M + 2) -Matrix, füllen Sie sie mit Nullen und kopieren Sie dann Ihre Werte wie folgt:

temp (i + 1, j + 1) <- ursprünglich (i, j)

Jetzt haben Sie tatsächlich Ihre ursprüngliche Matrix mitum sie herum umrandete Ränder. Sie können jetzt die Summe aller Nachbarn aller Nicht-Kanten-Zellen in der temporären Matrix sicher berechnen. Das Ergebnis ist die Matrix, nach der Sie ursprünglich gesucht haben.

Hinweis: Dies ist weniger effizient als die von Ihnen vorgeschlagene einfache Lösung mit fünf Schleifen.