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

Zadanie 6 z Matury 2017

VPS Starter Arubacloud
0 głosów
607 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ź 1,958 wizyt
pytanie zadane 19 sierpnia 2018 w Python przez MazdyxX Nowicjusz (190 p.)
0 głosów
1 odpowiedź 579 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Seyn Początkujący (300 p.)
+5 głosów
1 odpowiedź 5,582 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...