Kiedy w arkuszu maturalnym pojawia się słowo "macierz" albo "piksele na ekranie", wielu uczniów wpada w panikę. Zupełnie niepotrzebnie! Macierz to matematyczna nazwa na coś, co doskonale znasz z życia codziennego: arkusz w Excelu, planszę do statków, szachownicę, czy układ ławek w klasie. To po prostu tablica dwuwymiarowa (2D) – czyli taka, która ma wiersze (poziome) i kolumny (pionowe).
Na maturze zadania z tablic 2D (np. symulacja automatu komórkowego typu "Gra w Życie", przekształcanie obrazków, czy analiza labiryntu) pojawiają się niezwykle często. Zrozumienie, jak się po nich poruszać, to darmowe punkty. Zaczynamy od absolutnych podstaw.
1. Współrzędne: Wiersz czy Kolumna? (Najważniejsza zasada)
W matematyce szkolnej na wykresie najpierw podajemy x (poziom), a potem y (pion). W informatyce, przy tablicach dwuwymiarowych, zazwyczaj jest na odwrót!
Tablica[Y][X] - zapamiętaj to na zawsze!
Większość tablic 2D w kodzie obsługujemy jako tablica[wiersz][kolumna]. Wiersz (z ang. row) to nasza współrzędna Y (idąca z góry na dół), a kolumna (z ang. col) to nasza współrzędna X (idąca od lewej do prawej). Jeśli chcesz pobrać element, najpierw mówisz "w której jest linii", a potem "który to element w tej linii".
2. Tworzenie (inicjalizacja) tablicy 2D
Zanim zaczniemy cokolwiek liczyć, musimy utworzyć pustą tablicę o wymiarach N x M (gdzie N to liczba wierszy, a M to liczba kolumn) i wypełnić ją np. zerami.
Python: Pułapka referencji!
W Pythonie tablicę 2D robimy jako "listę list". Każdy wiersz to osobna lista, a cała tablica to lista zawierająca te wiersze.
# ZŁY SPOSÓB (Pułapka na maturze!)
# Wiele osób pisze tak, by stworzyć tablicę 3x3 wypełnioną zerami:
zla_tablica = [[0] * 3] * 3
# Dlaczego to błąd? Bo Python nie kopiuje wierszy, tylko tworzy 3 odnośniki do TEGO SAMEGO wiersza!
# Jeśli zmienisz zla_tablica[0][0] = 5, zmienią się też elementy w pozostałych wierszach!
# DOBRY SPOSÓB (Używaj List Comprehension)
N_wierszy = 3
M_kolumn = 4
dobra_tablica = [[0 for _ in range(M_kolumn)] for _ in range(N_wierszy)]
dobra_tablica[0][0] = 5 # Zmieni się tylko jeden element. Bezpieczne i pewne!C++: Klasyczna tablica vs Vector
W C++ możemy użyć klasycznej tablicy statycznej (jeśli z góry znamy rozmiar, np. 100x100) lub, co bezpieczniejsze i polecane, zagnieżdżonego wektora.
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N_wierszy = 3;
int M_kolumn = 4;
// Sposób 1: Tablica statyczna globalna (wymiary muszą być znane przed kompilacją)
// W C++ globalne tablice same wypełniają się zerami.
// int tab_stat[100][100];
// Sposób 2: Vector (Dynamiczny, bezpieczniejszy, polecany na maturze)
// Tworzymy wektor o rozmiarze N_wierszy, gdzie każdy element to wektor o rozmiarze M_kolumn wypełniony zerami.
vector<vector<int>> tablica(N_wierszy, vector<int>(M_kolumn, 0));
tablica[0][0] = 5;
return 0;
}3. Poruszanie się po macierzy: Magia dwóch pętli (O(N*M))
Aby odwiedzić każdy element (np. w celu wypisania go na ekran lub zsumowania), potrzebujemy dwóch pętli for - jednej wewnątrz drugiej. Zewnętrzna pętla zazwyczaj odpowiada za wiersze (przechodzimy linię po linii), a wewnętrzna przesuwa się po kolumnach (od lewej do prawej).
Kod - Python (Klasyczne przejście i ładne wypisywanie)
# Definiujemy funkcję pomocniczą WYŻEJ, aby utrzymać czystą strukturę kodu
def wypisz_macierz(macierz):
for wiersz in range(len(macierz)):
for kolumna in range(len(macierz[wiersz])):
# Z end=" " wypisujemy w jednej linii, oddzielając spacją
print(macierz[wiersz][kolumna], end=" ")
# Po zakończeniu wiersza (wewnętrznej pętli), robimy enter (nową linię)
print()
# --- Główny program ---
moja_macierz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print("Oto macierz:")
wypisz_macierz(moja_macierz)Zrozum to wizualnie
Pętle działają jak skaner w drukarce. Zewnętrzna pętla ustawia głowicę na wierszu nr 0. Wewnętrzna pętla przesuwa głowicę w prawo (kolumna 0, 1, 2). Kiedy wewnętrzna pętla się skończy, zewnętrzna przeskakuje na wiersz nr 1 i znowu skanuje od lewej do prawej. To najczęstszy i najbardziej intuicyjny wzorzec.
4. Maturalne klasyki: Przekątne i Sąsiedzi
Jeśli zadanie dotyczy macierzy kwadratowej (tyle samo wierszy co kolumn, N x N), prawie na pewno spotkasz się z operacjami na przekątnych (diagonals). Nie potrzebujesz do tego dwóch pętli!
Główna Przekątna
Idzie z lewego górnego rogu do prawego dolnego. Jej cechą charakterystyczną jest to, że współrzędna wiersza jest równa współrzędnej kolumny (wiersz == kolumna lub i == j). Zamiast dwóch pętli, użyj jednej:
def suma_glownej_przekatnej(macierz, N):
suma = 0
for i in range(N):
suma += macierz[i][i] # Bierzemy [0][0], [1][1], [2][2]...
return sumaPrzekątna Poboczna (Anty-przekątna)
Idzie z prawego górnego rogu do lewego dolnego. Jej cechą jest to, że suma indeksów wynosi N - 1 (czyli wiersz + kolumna = N - 1, z czego wynika, że kolumna = N - 1 - wiersz).
int suma_pobocznej_przekatnej(const vector<vector<int>>& macierz, int N) {
int suma = 0;
for(int i = 0; i < N; i++) {
int j = N - 1 - i;
suma += macierz[i][j];
}
return suma;
}Badanie sąsiadów elementu (Sprawdzanie granic!)
Uważaj na Index Out of Bounds
W zadaniach typu 'Gra w Życie' lub 'Wypełnianie obszaru', musisz sprawdzić pola obok konkretnego punktu (góra, dół, lewo, prawo). Największym błędem jest sprawdzanie sąsiada dla elementu na brzegu tablicy (np. sąsiada po lewej dla elementu w kolumnie 0). Program wysypie się błędem wyjścia poza tablicę! Zawsze dodawaj instrukcje if sprawdzające, czy nie wychodzisz za granicę.
5. Przykładowe zadanie maturalne z rozwiązaniem
Zadanie: Wiersz o największej sumie
Treść: Dana jest macierz z liczbami całkowitymi. Znajdź indeks wiersza, którego suma elementów jest największa, oraz wypisz tę sumę.
Rozwiązanie w Pythonie
# Zgodnie z dobrymi praktykami, małe funkcje logiki wyrzucamy nad blok główny
def suma_elementow_w_linii(lista_liczb):
suma = 0
for liczba in lista_liczb:
suma += liczba
return suma
# --- Główny program ---
macierz = [
[1, 5, 2],
[8, 1, 1],
[3, 4, 4]
]
max_suma = -1
najlepszy_wiersz = -1
# Przechodzimy przez wszystkie wiersze z ich indeksem (i)
for i in range(len(macierz)):
# Pobieramy cały wiersz i liczymy jego sumę naszą funkcją
aktualny_wiersz = macierz[i]
suma_wiersza = suma_elementow_w_linii(aktualny_wiersz)
# Jeśli znaleźliśmy nową największą sumę, aktualizujemy zmienne
if suma_wiersza > max_suma:
max_suma = suma_wiersza
najlepszy_wiersz = i
print(f"Największa suma to {max_suma} w wierszu nr {najlepszy_wiersz}.")
# Wynik: Największa suma to 11 w wierszu nr 2.Podsumowanie - Twoja maturalna ściągawka
- Słowo macierz = Tabela 2D. Nie daj się przestraszyć terminologii.
- Kolejność współrzędnych: Pamiętaj, że w programowaniu to najczęściej
tablica[Y][X], czylitablica[wiersz][kolumna]. - Python - bezpieczne tworzenie: Zapomnij o mnożeniu list
[[0]N]M. Zawsze używaj list comprehension:[[0 for _ in range(kolumny)] for _ in range(wiersze)]. - Dwie pętle to norma: Przejście po całej strukturze zawsze będzie wymagać zewnętrznej pętli dla wierszy i wewnętrznej dla kolumn. Złożoność takiego operowania to O(N x M).
- Przekątne: Jeśli badasz przekątne w macierzy kwadratowej, wystarczy Ci tylko jedna pętla
for i in range(N).
Zrozumienie jak działa indeksowanie w dwóch wymiarach to kamień węgielny do dziesiątek innych, bardziej skomplikowanych algorytmów (np. szukania ścieżek w labiryntach BFS-em). Poćwicz tworzenie tablic na sucho, a na egzaminie zrobisz to z zamkniętymi oczami.
Chcesz przećwiczyć to na prawdziwych zadaniach ze starych arkuszy? Odwiedź nasz kurs do matury z informatyki.