• 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]

Object Storage Arubacloud
0 głosów
804 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,063 wizyt
pytanie zadane 25 lutego 2019 w C i C++ przez Dorian Bajorek Dyskutant (7,920 p.)
0 głosów
0 odpowiedzi 907 wizyt
pytanie zadane 6 stycznia 2019 w Java przez krawiecki Początkujący (490 p.)
0 głosów
1 odpowiedź 595 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Seyn Początkujący (300 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...