• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ zadanie maturalne - problem [MATURA 2017 INF. ROZSZ. PIKSELE]

Cloud VPS
0 głosów
1,043 wizyt
pytanie zadane 31 maja 2018 w C i C++ przez AdrianM Nowicjusz (180 p.)
#include <iostream>
#include <fstream>

using namespace std;

int P[200][320];

ifstream file("dane.txt");

int main()
{

    //load
    for(int i = 0; i < 200; i++) {
        for(int j = 0; j < 320; j++) {
            file >> P[i][j];
        }
    }

    //6.4
    int lentmp = 0;
    int len = 1;

    for(int i = 0; i < 200; i++) {
        int j = 0;
        lentmp = 0;

            while(j < 319 && P[i][j] == P[i][j + 1]) {
                lentmp++;
                j++;
            }
            if(lentmp > len) len = lentmp;
        }

    cout << len;

    return 0;
}

Witam, to jest moja wersja algorytmu na rozwiązanie zadania z matury 2017:

https://cke.gov.pl/egzamin-maturalny/egzamin-w-nowej-formule/arkusze/2017-2/

[TREŚĆ]

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).

[ZADANIE 6.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.

[PROBLEM]

Wydaję mi się, że algorytm nie jest do końca poprawny tylko problem w tym że nie wiem za bardzo jak go poprawić - ale to co wydaje mi się złe to to ze szukając ciągu takich samych pikseli szukam go tylko raz w danym wierszu - znajdując go nie sprawdzam już pozostałych - wynik jest dobry (5), ale to może być kwestia przypadku, bo może akurat on był jako pierwszy w ciągu wszystkich tych "pikseli".

1 odpowiedź

0 głosów
odpowiedź 31 maja 2018 przez RafalS VIP (122,820 p.)
int P[200][320];
 
ifstream file("dane.txt");
 
int main()
{

Nawet nie wiesz jak mnie to boli :(. Zmienne globalne to zło.

A teraz do rzeczy. 

while (j < 319 && P[i][j] == P[i][j + 1])

Albo ja czegoś nie rozumiem w treści, albo ten dobry wynik to mega przypadek.

Po pierwsze tak jak piszesz - Twój program sprawdza tylko początki wierszy. Jeśli ciąg będzie w środku to do niego nie dojdziesz. A po drugie Twój program sprawdza wiersze, a miał kolumny. Musisz więc przeiterować po kolumnach. Czyli w takiej kolejności:
P[0][0]
P[1][0]
P[2][0]
...
P[199][0]
P[0][1]
P[1][1]
...

Problem z szukaniem rozwiąż zmienną obecnaWartość. Przed każdym obiegiem pętli wewnętrznej przypisz jej nieosiągnalną wartość np -1. W pętli wewnętrznej jeśli P[i][j] równe obecnej wartosci to licznikPowtórzen++, jesli nie to sprawdzasz czy pobliśmy dotychczasowy rekord i jeśli tak to go zapisujemy a potem do licznika powtórzen przypisujemy 1 i podmieniamy obecnaWartosc na nową.

Jak sobie nie poradzisz to pisz w komentarzach, bo sam nie wiem czy czytelnie to wytłumaczyłem, a tak prostego gotowca też nie chce dawać. Tym bardziej, że mi nie wolno, bo tak mówi regulamin :P

komentarz 31 maja 2018 przez Aisekai Nałogowiec (42,190 p.)
Teoretycznie wolno, bo ten punkt w regulaminie dotyczy bardziej sytuacji gdy jakaś osoba zakłada wątek, w którym prosi o rozwiązanie problemu nie pokazując, że już coś zrobił w tym kierunku.

Jednakże imo lepiej jak autor spróbuje to samemu napisać a jak się nie uda to poprosić o pomoc na forum.
komentarz 31 maja 2018 przez AdrianM Nowicjusz (180 p.)
edycja 31 maja 2018 przez AdrianM

@RafalS, Okej, dało mi to do myślenia, a błąd z kolumnami był bardzo głupi i przypadkowy, a takie często mi się zdarzają :/ 

Czy taka realizacja jest poprawna?

    //6.4
    int lentmp = 0;
    int len = -1; 
    int obecna;

    for(int j = 0; j < 320; j++) {
        obecna = P[0][j];
        for(int i = 0; i < 200; i++) {
                if(P[i][j] == obecna) {
                    lentmp++;
                }
                else {
                    if(lentmp > len) len = lentmp;
                    lentmp = 0;
                    obecna = P[i][j];
                }
        }
    }

Wolę się upewnić, żeby znowu nie wyszedł przypadkowy wynik :P

1
komentarz 31 maja 2018 przez RafalS VIP (122,820 p.)
lentmp = 0;

to, że przeczytaliśmy inny oznacza, że już jeden mamy :p czyli przypisujesz 1.

A tak btw polecam sobie to przetestować. Zrób jakiś mniejszy plik z danymi, żebyś mógł sam przeliczyć jaki powinien być poprawny wynik i testuj czy program liczy dobrze

komentarz 31 maja 2018 przez AdrianM Nowicjusz (180 p.)

już wszystko działa - tam wcześniej w pętli 

for(int i = 0; i < 200; i++)

liczyłem od 0 gdzie obecna wartość była taka sama zaraz po wejściu (bo wcześniej przypisywałem P[0][j]) więc - zmieniłem go na:

for(int i = 1; i < 200; i++)

i wszystkie lentmp na:

lentmp = 1;

i według tego co testowałem wszystko się zgadza ;)

Dziękuje bardzo za pomoc! :P

Podobne pytania

0 głosów
1 odpowiedź 1,448 wizyt
pytanie zadane 25 lutego 2019 w C i C++ przez Dorian Bajorek Dyskutant (7,920 p.)
0 głosów
0 odpowiedzi 1,076 wizyt
pytanie zadane 6 stycznia 2019 w Java przez krawiecki Początkujący (490 p.)
0 głosów
1 odpowiedź 788 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Seyn Początkujący (300 p.)

93,468 zapytań

142,404 odpowiedzi

322,707 komentarzy

62,852 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...