Autor rozwiązania: Maciej Muras

W pliku dane.txt znajduje się 200 wierszy. Każdy wiersz zawiera 320 liczb naturalnych
z przedziału od 0 do 255, oddzielonych znakami pojedynczego odstępu (spacjami).
Przedstawiają one jasności kolejnych pikseli czarno-białego obrazu o wymiarach 320 na 200
pikseli (od 0 – czarny do 255 – biały).
Napisz program(y), który(e) da(dzą) odpowiedzi do poniższych zadań. Odpowiedzi zapisz
w pliku wyniki6.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie
zadanie.
Uwaga: plik przyklad.txt zawiera dane przykładowe spełniające warunki zadania (obraz
ma takie same rozmiary). Odpowiedzi dla danych z pliku przyklad.txt są podane pod
poleceniami.

Plik z zadaniami można pobrać ze strony https://cke.gov.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2017/formula_od_2015/informatyka/MIN-R2_1P-172.pdf

Pliki z danymi:

dane

przyklad

Rozwiązanie:

package com.company;
import java.io.*;
import java.util.*;
public class Main {

    public static void main(String[] args) throws FileNotFoundException  {
        Scanner odczyt  = new Scanner(new File ("dane.txt"));
        int kolejnaLiczba, ciemny=255,jasny=0,numerLini=0,wierszeBezSymetrii=0, liczbaKonstrasujacychPixeli=0,
                najdluzszaLiniaZTychSamychPixeli=1,aktualnieNajdluzszaLiniaZTychSamychPixeli=1, aktualnyPixel;
        int tablicaPixeli[][]=new int[200][320];
        boolean pixelKontrastuje=false;
        while (odczyt.hasNextInt())
        {
            for(int liczbyWWierszu=0;liczbyWWierszu<320;liczbyWWierszu++) {
                kolejnaLiczba =odczyt.nextInt();
                tablicaPixeli[numerLini][liczbyWWierszu]=kolejnaLiczba;

/*
Zadanie 6.1. (0-2)
Podaj jasność najjaśniejszego i jasność najciemniejszego piksela.
Dla danych z pliku przyklad.txt wynikiem jest 255 (najjaśniejszy) i 0 (najciemniejszy). 
*/
//-----------------------------------rozwiązanie 6.1-----------------------------------
                if (kolejnaLiczba>jasny) jasny=kolejnaLiczba;
                if (kolejnaLiczba<ciemny) ciemny=kolejnaLiczba;
            }
            numerLini++;
        }
        odczyt.close();

/*
Zadanie 6.2. (0–2)
Podaj, ile wynosi najmniejsza liczba wierszy, które należy usunąć, żeby obraz miał pionową oś
symetrii. Obraz ma pionową oś symetrii, jeśli w każdym wierszu i-ty piksel od lewej strony
przyjmuje tę samą wartość, co i-ty piksel od prawej strony, dla dowolnego 1 ≤ i ≤ 320.
Dla danych z pliku przyklad.txt wynikiem jest 3.
*/
//-----------------------------------rozwiązanie 6.2-----------------------------------
        for(numerLini=0;numerLini<200;numerLini++) {
            for(int liczbyWWierszu=0;liczbyWWierszu<160;liczbyWWierszu++) {

                if( tablicaPixeli[numerLini][liczbyWWierszu]!=tablicaPixeli[numerLini][319-liczbyWWierszu])
                {
                     wierszeBezSymetrii++;
                     break;
                }
            }
        }
/*
Zadanie 6.3. (0–3)
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.
Dla danych z pliku przyklad.txt wynikiem jest 5. 
*/
//-----------------------------------rozwiązanie 6.3-----------------------------------

        for(numerLini=0;numerLini<200;numerLini++) {
            for (int liczbyWWierszu = 0; liczbyWWierszu < 320; liczbyWWierszu++) {
                pixelKontrastuje=false;
                aktualnyPixel=tablicaPixeli[numerLini][liczbyWWierszu];
                if( (liczbyWWierszu>0)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini][liczbyWWierszu-1]))>128) pixelKontrastuje=true;
                if( (liczbyWWierszu<319)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini][liczbyWWierszu+1]))>128) pixelKontrastuje=true;
                if( (numerLini>0)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini-1][liczbyWWierszu]))>128) pixelKontrastuje=true;
                if( (numerLini<199)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini+1][liczbyWWierszu]))>128) pixelKontrastuje=true;
                if (pixelKontrastuje) liczbaKonstrasujacychPixeli++;
            }
        }

/*
Zadanie 6.4. (0–4)
Podaj długość najdłuższej linii pionowej (czyli ciągu kolejnych pikseli w tej samej kolumnie
obrazka), złożonej z pikseli tej samej jasności.
Dla danych z pliku przyklad.txt wynikiem jest 198. 
*/
//-----------------------------------rozwiązanie 6.4-----------------------------------
        for (int liczbyWWierszu = 0; liczbyWWierszu < 320; liczbyWWierszu++) {
            aktualnieNajdluzszaLiniaZTychSamychPixeli=1;
            for (numerLini = 1; numerLini < 200; numerLini++) {
                if (tablicaPixeli[numerLini][liczbyWWierszu] == tablicaPixeli[numerLini-1][liczbyWWierszu]) {
                    aktualnieNajdluzszaLiniaZTychSamychPixeli++;
                    if (aktualnieNajdluzszaLiniaZTychSamychPixeli > najdluzszaLiniaZTychSamychPixeli)
                        najdluzszaLiniaZTychSamychPixeli++;
                } else aktualnieNajdluzszaLiniaZTychSamychPixeli = 1;

            }
        }
        System.out.println("6.1: Najjaśniejszy to: "+jasny+" Najciemniejszy to: "+ciemny);
        System.out.println("6.2: Wiersze bez symetrii: "+wierszeBezSymetrii);
        System.out.println("6.3: Liczba pixeli kontrastujących: "+liczbaKonstrasujacychPixeli);
        System.out.println("6.4: Najdłuższa linia pionowa z tych samych pikseli: "+najdluzszaLiniaZTychSamychPixeli);


    }
}