/ / Prawidłowy sposób obsługi krawędzi macierzy - c ++, algorytm, macierz

Prawidłowy sposób obsługi krawędzi macierzy - c ++, algorytm, macierz

Załóżmy, że musimy napisać prosty program, który przekształca macierz. Każdy element powinien być sumą jego sąsiadujących elementów.

Jaki jest „prawidłowy” (tj. Najczęstszy, ma najlepszą czytelność, najbardziej efektywny) sposób, aby to zrobić, biorąc pod uwagę krawędzie matrycy?

Dwa oczywiste oczywiste sposoby osiągnięcia tego celu, o których mogę myśleć:

  1. Najpierw zajmuj się narożnikami (4 oddzielne linie), użyj 4 pętli, aby zrobić pozostałe krawędzie, a następnie użyj standardowej pętli do reszty
  2. Użyj jednej pętli dla całej macierzy z if„s, aby sprawdzić, czy jesteśmy w środku, czy jest to przypadek na krawędzi.

Pierwszy jest szybszy (tak myślę), ale wygląda na to, że mam do tego 4 linie i 5 pętli.

Czy istnieje bardziej elegancki sposób? Oznacziłem to jako C ++, ponieważ obecnie koduję w C ++ i mam wrażenie, że operator trójskładnikowy ?: przyda się napisać urocze rozwiązanie.

Punkty bonusowe, jeśli twoje rozwiązanie może zostać poprawionebardziej złożona reguła (nie tylko wyszukiwanie jednej komórki w górę / w prawo / w lewo / w dół, ale jeśli wykonujesz pewien rodzaj rekurencji). Nie jestem jednak pewien, czy to bardzo by to zmieniło.

Odpowiedzi:

2 dla odpowiedzi № 1

Jednym eleganckim sposobem na to jest użycie większej matrycy. Jeśli macierz zawiera elementy NxM, utwórz tymczasową macierz (N + 2) x (M + 2), wypełnij ją zerami, a następnie skopiuj wartości w następujący sposób:

temp (i + 1, j + 1) <- oryginał (i, j)

Teraz masz już oryginalną matrycęwyzerowane krawędzie wokół niego. Możesz teraz bezpiecznie obliczyć sumę wszystkich sąsiadów wszystkich komórek innych niż krawędź w macierzy tymczasowej. Rezultatem będzie macierz, której pierwotnie szukasz.

Uwaga - będzie to mniej wydajne niż zaproponowane proste rozwiązanie z pięcioma pętlami.