{"id":"informatyka-2017-maj-matura-rozszerzona/zad/6.3","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"6.3","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nSąsiednie piksele to takie, które leżą obok siebie w tym samym wierszu lub w tej samej kolumnie. Dwa sąsiednie piksele nazywamy kontrastującymi, jeśli ich wartości różnią się o więcej niż 128. Podaj liczbę wszystkich takich pikseli, dla których istnieje przynajmniej jeden kontrastujący z nim sąsiedni piksel.\n\nDla danych z pliku przyklad.txt wynikiem jest 5.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Liczba pikseli mających przynajmniej jednego kontrastującego sąsiada: 753** (z 64 000 pikseli w `dane.txt`).\n\nDla `przyklad.txt`: 5.\n\nKluczowe definicje:\n- Sąsiad piksela (r, c): (r-1, c), (r+1, c), (r, c-1), (r, c+1) - góra, dół, lewo, prawo (4-sąsiedztwo).\n- Kontrastujący: |A[r1][c1] - A[r2][c2]| > 128 (różnica BEZWZGLĘDNA, ostro większa).\n- Liczymy KAŻDY piksel raz, jeśli MA przynajmniej jednego takiego sąsiada.\n\n## Sposób 1 - Python (najczytelniejszy)\n\n```python\n# Wczytaj obraz jako liste list\nwith open('dane.txt') as f:\nobraz = [[int(x) for x in linia.split()] for linia in f]\n\nW, K = len(obraz), len(obraz[0]) # 200 wierszy, 320 kolumn\nKONTRAST = 128\nlicznik = 0\n\nfor r in range(W):\nfor c in range(K):\nv = obraz[r][c]\n# Sprawdz 4 sasiadow\nma_kontrast = False\nfor dr, dc in [(-1,0), (1,0), (0,-1), (0,1)]:\nnr, nc = r + dr, c + dc\nif 0 <= nr < W and 0 <= nc < K:\nif abs(obraz[nr][nc] - v) > 128:\nma_kontrast = True\nbreak\nif ma_kontrast:\nlicznik += 1\n\nprint(licznik) # 753\n\n## Sposób 2 - C++ (z tablicą 2D)\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <cmath>\nusing namespace std;\n\nconst int W = 200, K = 320;\nint obraz[W][K];\n\nint main() {\nifstream plik(\"dane.txt\");\nfor (int r = 0; r < W; r++)\nfor (int c = 0; c < K; c++)\nplik >> obraz[r][c];\nint dr[] = {-1, 1, 0, 0};\nint dc[] = {0, 0, -1, 1};\nint licznik = 0;\nfor (int r = 0; r < W; r++) {\nfor (int c = 0; c < K; c++) {\nfor (int k = 0; k < 4; k++) {\nint nr = r + dr[k], nc = c + dc[k];\nif (nr >= 0 && nr < W && nc >= 0 && nc < K) {\nif (abs(obraz[nr][nc] - obraz[r][c]) > 128) {\nlicznik++;\nbreak; // wystarczy jeden kontrast\n}\n}\n}\n}\n}\ncout << licznik << endl; // 753\nreturn 0;\n}\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram Kontrast;\nvar\nobraz: array[1 200, 1 320] of Integer;\nr, c, nr, nc, k: Integer;\ndr: array[1 4] of Integer = (-1, 1, 0, 0);\ndc: array[1 4] of Integer = (0, 0, -1, 1);\nlicznik: Integer;\nma_kontrast: Boolean;\nf: TextFile;\nbegin\nAssignFile(f, 'dane.txt'); Reset(f);\nfor r := 1 to 200 do\nfor c := 1 to 320 do Read(f, obraz[r, c]);\nCloseFile(f);\nlicznik := 0;\nfor r := 1 to 200 do\nfor c := 1 to 320 do\nbegin\nma_kontrast := False;\nfor k := 1 to 4 do\nbegin\nnr := r + dr[k]; nc := c + dc[k];\nif (nr >= 1) and (nr <= 200) and (nc >= 1) and (nc <= 320) then\nif Abs(obraz[nr, nc] - obraz[r, c]) > 128 then\nbegin\nma_kontrast := True;\nBreak;\nend;\nend;\nif ma_kontrast then Inc(licznik);\nend;\nWriteln(licznik); // 753\nend.\n\n## Reference algorytmiczny - 4-sąsiedztwo na siatce\n\n> Reference - typowy wzór na 4 sąsiadów:\n> - **dr/dc = [(-1,0), (1,0), (0,-1), (0,1)]** - góra, dół, lewo, prawo.\n> - Sprawdzaj granice siatki: `0 <= nr < W and 0 <= nc < K` (Python) lub `nr >= 1 <= W` (Pascal indeksuje od 1).\n> - **Wartość bezwzględna** - `abs( )` w Pythonie / `Abs( )` w Pascalu / `abs( )` w `<cmath>`.\n> - **Optymalizacja:** `break` po znalezieniu pierwszego kontrastującego sąsiada - wystarczy jeden, by piksel zaliczyć.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.3, max 3 pkt):\n> - **3 pkt** - prawidłowa odpowiedź: **753**.\n> - **2 pkt** - odpowiedź **768** (różnica wartości większa lub RÓWNA 128 - błąd \"≥\" zamiast \">\").\n> - **1 pkt** - odpowiedź **166** lub **587** (brak wartości bezwzględnej - tylko jedna strona różnicy).\n> - **1 pkt** - odpowiedź **1226** (wielokrotne zliczanie tego samego piksela, gdy ma kilku kontrastujących sąsiadów).\n> - **1 pkt** - odpowiedź **747** / **750** / **752** (nie uwzględniono pikseli brzegowych - pomyłka z indeksami).\n> - **0 pkt** - inna błędna lub brak.\n\n## Typowe pułapki\n\n- **Różnica BEZWZGLĘDNA** - `|a - b|` > 128, nie `a - b` > 128. Bez `abs()` tracimy połowę kontrastów (lub kradniemy 2 pkt z 3).\n- **STRICTNIE większa od 128** - wartość 128 NIE jest kontrastem. Często studenci piszą `>= 128` i tracą punkty (otrzymują 768 zamiast 753).\n- **Liczenie tego samego piksela WIELOKROTNIE** - jeśli piksel ma 2-3 kontrastujących sąsiadów, mimo to liczymy go RAZ. `break` po pierwszym kontraście rozwiązuje problem.\n- **Brzegowe piksele** - piksele rogowe mają tylko 2 sąsiadów, krawędziowe 3. Sprawdzenie granic siatki obowiązkowe - inaczej out-of-bounds lub błędne wyniki (747/750/752).\n- **4-sąsiedztwo vs 8-sąsiedztwo** - zadanie wyraźnie mówi \"obok siebie w tym samym wierszu LUB w tej samej kolumnie\", czyli 4-sąsiedztwo (bez diagonali).\n\n## Złożoność obliczeniowa\n\n- Wczytanie: O(n × m) = O(64 000).\n- Iteracja po wszystkich pikselach × 4 sąsiadów: O(4 · n · m) = O(256 000).\n- **Całkowita: O(n · m)**, liniowa względem rozmiaru obrazu.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 6.1.</p>\n<p>Sąsiednie piksele to takie, które leżą obok siebie w tym samym wierszu lub w tej samej kolumnie. Dwa sąsiednie piksele nazywamy kontrastującymi, jeśli ich wartości różnią się o więcej niż 128. Podaj liczbę wszystkich takich pikseli, dla których istnieje przynajmniej jeden kontrastujący z nim sąsiedni piksel.</p>\n<p>Dla danych z pliku przyklad.txt wynikiem jest 5.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Liczba pikseli mających przynajmniej jednego kontrastującego sąsiada: 753</strong> (z 64 000 pikseli w <code>dane.txt</code>).</p>\n<p>Dla <code>przyklad.txt</code>: 5.</p>\n<p>Kluczowe definicje:</p>\n<ul><li>Sąsiad piksela (r, c): (r-1, c), (r+1, c), (r, c-1), (r, c+1) - góra, dół, lewo, prawo (4-sąsiedztwo).</li><li>Kontrastujący: |A[r1][c1] - A[r2][c2]| &gt; 128 (różnica BEZWZGLĘDNA, ostro większa).</li><li>Liczymy KAŻDY piksel raz, jeśli MA przynajmniej jednego takiego sąsiada.</li></ul>\n<h4>Sposób 1 - Python (najczytelniejszy)</h4>\n<p>```python</p>\n<h3>Wczytaj obraz jako liste list</h3>\n<p>with open(&#x27;dane.txt&#x27;) as f:<br>obraz = [[int(x) for x in linia.split()] for linia in f]</p>\n<p>W, K = len(obraz), len(obraz[0]) # 200 wierszy, 320 kolumn<br>KONTRAST = 128<br>licznik = 0</p>\n<p>for r in range(W):<br>for c in range(K):<br>v = obraz[r][c]</p>\n<h3>Sprawdz 4 sasiadow</h3>\n<p>ma_kontrast = False<br>for dr, dc in [(-1,0), (1,0), (0,-1), (0,1)]:<br>nr, nc = r + dr, c + dc<br>if 0 &lt;= nr &lt; W and 0 &lt;= nc &lt; K:<br>if abs(obraz[nr][nc] - v) &gt; 128:<br>ma_kontrast = True<br>break<br>if ma_kontrast:<br>licznik += 1</p>\n<p>print(licznik) # 753</p>\n<h4>Sposób 2 - C++ (z tablicą 2D)</h4>\n<p>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;cmath&gt;<br>using namespace std;</p>\n<p>const int W = 200, K = 320;<br>int obraz[W][K];</p>\n<p>int main() {<br>ifstream plik(&quot;dane.txt&quot;);<br>for (int r = 0; r &lt; W; r++)<br>for (int c = 0; c &lt; K; c++)<br>plik &gt;&gt; obraz[r][c];<br>int dr[] = {-1, 1, 0, 0};<br>int dc[] = {0, 0, -1, 1};<br>int licznik = 0;<br>for (int r = 0; r &lt; W; r++) {<br>for (int c = 0; c &lt; K; c++) {<br>for (int k = 0; k &lt; 4; k++) {<br>int nr = r + dr[k], nc = c + dc[k];<br>if (nr &gt;= 0 &amp;&amp; nr &lt; W &amp;&amp; nc &gt;= 0 &amp;&amp; nc &lt; K) {<br>if (abs(obraz[nr][nc] - obraz[r][c]) &gt; 128) {<br>licznik++;<br>break; // wystarczy jeden kontrast<br>}<br>}<br>}<br>}<br>}<br>cout &lt;&lt; licznik &lt;&lt; endl; // 753<br>return 0;<br>}</p>\n<h4>Sposób 3 - Pascal</h4>\n<p>```pascal<br>program Kontrast;<br>var<br>obraz: array[1 200, 1 320] of Integer;<br>r, c, nr, nc, k: Integer;<br>dr: array[1 4] of Integer = (-1, 1, 0, 0);<br>dc: array[1 4] of Integer = (0, 0, -1, 1);<br>licznik: Integer;<br>ma_kontrast: Boolean;<br>f: TextFile;<br>begin<br>AssignFile(f, &#x27;dane.txt&#x27;); Reset(f);<br>for r := 1 to 200 do<br>for c := 1 to 320 do Read(f, obraz[r, c]);<br>CloseFile(f);<br>licznik := 0;<br>for r := 1 to 200 do<br>for c := 1 to 320 do<br>begin<br>ma_kontrast := False;<br>for k := 1 to 4 do<br>begin<br>nr := r + dr[k]; nc := c + dc[k];<br>if (nr &gt;= 1) and (nr &lt;= 200) and (nc &gt;= 1) and (nc &lt;= 320) then<br>if Abs(obraz[nr, nc] - obraz[r, c]) &gt; 128 then<br>begin<br>ma_kontrast := True;<br>Break;<br>end;<br>end;<br>if ma_kontrast then Inc(licznik);<br>end;<br>Writeln(licznik); // 753<br>end.</p>\n<h4>Reference algorytmiczny - 4-sąsiedztwo na siatce</h4>\n<blockquote>Reference - typowy wzór na 4 sąsiadów:<br>- <strong>dr/dc = [(-1,0), (1,0), (0,-1), (0,1)]</strong> - góra, dół, lewo, prawo.<br>- Sprawdzaj granice siatki: <code>0 &lt;= nr &lt; W and 0 &lt;= nc &lt; K</code> (Python) lub <code>nr &gt;= 1 &lt;= W</code> (Pascal indeksuje od 1).<br>- <strong>Wartość bezwzględna</strong> - <code>abs( )</code> w Pythonie / <code>Abs( )</code> w Pascalu / <code>abs( )</code> w <code>&lt;cmath&gt;</code>.<br>- <strong>Optymalizacja:</strong> <code>break</code> po znalezieniu pierwszego kontrastującego sąsiada - wystarczy jeden, by piksel zaliczyć.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.3, max 3 pkt):<br>- <strong>3 pkt</strong> - prawidłowa odpowiedź: <strong>753</strong>.<br>- <strong>2 pkt</strong> - odpowiedź <strong>768</strong> (różnica wartości większa lub RÓWNA 128 - błąd &quot;≥&quot; zamiast &quot;&gt;&quot;).<br>- <strong>1 pkt</strong> - odpowiedź <strong>166</strong> lub <strong>587</strong> (brak wartości bezwzględnej - tylko jedna strona różnicy).<br>- <strong>1 pkt</strong> - odpowiedź <strong>1226</strong> (wielokrotne zliczanie tego samego piksela, gdy ma kilku kontrastujących sąsiadów).<br>- <strong>1 pkt</strong> - odpowiedź <strong>747</strong> / <strong>750</strong> / <strong>752</strong> (nie uwzględniono pikseli brzegowych - pomyłka z indeksami).<br>- <strong>0 pkt</strong> - inna błędna lub brak.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Różnica BEZWZGLĘDNA</strong> - <code>|a - b|</code> &gt; 128, nie <code>a - b</code> &gt; 128. Bez <code>abs()</code> tracimy połowę kontrastów (lub kradniemy 2 pkt z 3).</li><li><strong>STRICTNIE większa od 128</strong> - wartość 128 NIE jest kontrastem. Często studenci piszą <code>&gt;= 128</code> i tracą punkty (otrzymują 768 zamiast 753).</li><li><strong>Liczenie tego samego piksela WIELOKROTNIE</strong> - jeśli piksel ma 2-3 kontrastujących sąsiadów, mimo to liczymy go RAZ. <code>break</code> po pierwszym kontraście rozwiązuje problem.</li><li><strong>Brzegowe piksele</strong> - piksele rogowe mają tylko 2 sąsiadów, krawędziowe 3. Sprawdzenie granic siatki obowiązkowe - inaczej out-of-bounds lub błędne wyniki (747/750/752).</li><li><strong>4-sąsiedztwo vs 8-sąsiedztwo</strong> - zadanie wyraźnie mówi &quot;obok siebie w tym samym wierszu LUB w tej samej kolumnie&quot;, czyli 4-sąsiedztwo (bez diagonali).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie: O(n × m) = O(64 000).</li><li>Iteracja po wszystkich pikselach × 4 sąsiadów: O(4 · n · m) = O(256 000).</li><li><strong>Całkowita: O(n · m)</strong>, liniowa względem rozmiaru obrazu.</li></ul>"}]}