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

Zadanie 6 z Matury 2017

Object Storage Arubacloud
0 głosów
628 wizyt
pytanie zadane 16 maja 2022 w C i C++ przez Dominikele Nowicjusz (120 p.)
#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    fstream plik;
    int odczyt, x=0, y=0, odp3=0;

    int piksele[320][200];
    bool czy_kontrastuje[320][200] = {false};

    plik.open("dane.txt");
    while(plik.eof()==false)
    {

        plik >> odczyt;
        piksele[x][y] = odczyt;


        x++;
        if(x==320)
        {
            x=0;
            y++;
        }
    }
    plik.close();

    for(int i=0; i<200;i++)     //SPRAWDZANIE POZIOME
    {
        for(int j=0;j<319; j++)
        {
            if(abs(piksele[j][i] - piksele[j+1][i])>128)
            {
                czy_kontrastuje[j][i] = true;
                czy_kontrastuje[j+1][i] = true;
            }
        }
    }

    for(int i=0; i<199;i++)     //SPRAWDZANIE PIONOWE
    {
        for(int j=0;j<320; j++)
        {
            if(abs(piksele[j][i] - piksele[j][i+1])>128)
            {
                czy_kontrastuje[j][i] = true;
                czy_kontrastuje[j][i+1] = true;
            }
        }
    }

    for(int i=0; i<200; i++)
    {
        for(int j=0; j<320; j++)
        {
            if(czy_kontrastuje[j][i]==true)
            {
                odp3++;
            }
        }
    }

    cout << odp3 << endl << endl;
}

Dzień Dobry, zbliżają się matury i chciałbym poprosić o pomoc odnośnie zamieszczonego kodu.

Polecenie:

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.

Linki:

Arkusz maturalny: LINK
Odpowiedzi: LINK
Link pod którym można pobrać załączniki z plikami do zadania: LINK

Problem:

Napisany przeze mnie kod zwraca wartość 757, gdy poprawną odpowiedzią jest 753. Nie wiem gdzie pojawia się problem, czy leży on w pomyśle czy jego realizacji. Szukając odpowiedzi w Internecie zauważyłem że większość osób rozwiązywało to zadanie na przypadki, zależne od położenia piksela. W moim sposobie postanowiłem porównywać każdy obecny piksel z następnym w wierszu i w kolumnie zaczynając od pierwszych i kończąc na przedostatnich nadając im odpowiednie wartości prawda/fałsz aby żaden piksel nie został zliczony dwukrotnie.

1 odpowiedź

+1 głos
odpowiedź 16 maja 2022 przez manjaro Nałogowiec (37,390 p.)
edycja 16 maja 2022 przez manjaro

Tutaj masz moje rozwiązanie w Pythonie. Na pewno zrozumiesz  pomysł i znajdziesz błąd u siebie. Moja idea jest taka sama więc nie powinno być trudności.

tab = []
file = open('dane.txt', 'r')
for line in file:
    tab.append(line.split())
file.close()

result = []

for i in range(200):
    for j in range(319):
        if abs(int(tab[i][j]) - int(tab[i][j + 1])) > 128:
            if [i, j] not in result:
                result.append([i, j])
            if [i, j + 1] not in result:
                result.append([i, j + 1])

for i in range(199):
    for j in range(320):
        if abs(int(tab[i][j]) - int(tab[i + 1][j])) > 128:
            if [i, j] not in result:
                result.append([i, j])
            if [i + 1, j] not in result:
                result.append([i + 1, j])

print(len(result))
print(result)

Przepisałem jeszcze to samo w C++

#include <iostream>
#include <set>
#include <fstream>

int cnt(int tab[][320]) {
    std::set<std::pair<int, int>> result;
    for (int i= 0; i< 200; i++) {
        for (int j=0; j<319; j++) {
            if (abs(tab[i][j] - tab[i][j+1]) > 128) {
                result.emplace(i,j);
                result.emplace(i,j+1);
            }
        }
    }
    for (int i= 0; i< 199; i++) {
        for (int j=0; j<320; j++) {
            if (abs(tab[i][j] - tab[i+1][j]) > 128) {
                result.emplace(i,j);
                result.emplace(i+1,j);
            }
        }
    }
    return result.size();
}

int main(){
    int tab[200][320];
    std::fstream file;
    std::string filename;
    filename = "dane.txt";
    file.open(filename.c_str());

    for (int i=0; i<200; i++) {
       for (int j=0; j<320; j++) {
           file >> tab[i][j];
        }
    }
    file.close();
    std::cout << cnt(tab);
}

 

Podobne pytania

0 głosów
1 odpowiedź 2,016 wizyt
pytanie zadane 19 sierpnia 2018 w Python przez MazdyxX Nowicjusz (190 p.)
0 głosów
1 odpowiedź 593 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Seyn Początkujący (300 p.)
+5 głosów
1 odpowiedź 5,652 wizyt

92,555 zapytań

141,402 odpowiedzi

319,553 komentarzy

61,939 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!

...