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

Zadanie 6 z Matury 2017

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
389 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,370 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,645 wizyt
pytanie zadane 19 sierpnia 2018 w Python przez MazdyxX Nowicjusz (190 p.)
0 głosów
1 odpowiedź 461 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Seyn Początkujący (300 p.)
+5 głosów
1 odpowiedź 5,251 wizyt

91,832 zapytań

140,505 odpowiedzi

316,991 komentarzy

61,163 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...