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

Zadanie C++ Rozmycie(problem)

Object Storage Arubacloud
0 głosów
522 wizyt
pytanie zadane 31 stycznia 2017 w C i C++ przez Scypyon Gaduła (3,450 p.)

Treść zadania:  Wiesiek wziął prostokątną tablicę o wymiarach n × m podzieloną na nm jednakowych kwadratowych pól i namalował na niektórych z nich liczbę 3. Niestety był zmuszony nieść swoje dzieło przez deszcz i praca rozmyła się. Mówiąc ściślej pomalowane pola zafarbowały wszystkie sąsiadujące bokiem pola liczbą 2, te zaś zafarbowały sąsiadujące pola na 1. Jak teraz wygląda praca Wieśka?

Przykład: 

Wejście: 

3 5

00003

00300

00330

 

Wyjście:

01223

12322

12332

 

Moje nie działające rozwiązanie:

 

#include <iostream>
#include<iomanip>


using namespace std;

int w,k;
int i,j;
int nr, wr;

int main()
{
    cin>>w;
    cin>>k;

    int tablica[w][k];

    for(i=0; i<w; i++)
        for(j=0; j<k; j++)
           cin>>tablica[i][j];

    switch(tablica[nr][wr]==3)
    {

       case 1: if(tablica[nr-1][wr]<3) tablica[nr-1][wr]=3-1;
       case 2: if(tablica[nr+1][wr]<3) tablica[nr+1][wr]=3-1;
       case 3: if(tablica[nr][wr-1]<3) tablica[nr][wr-1]=3-1;
       case 4: if(tablica[nr][wr+1]<3) tablica[nr][wr+1]=3-1;
       case 5: if(tablica[nr][wr+2]<2) tablica[nr][wr+2]=3-2;
       case 6: if(tablica[nr-2][wr]<2) tablica[nr-2][wr]=3-2;
       case 7: if(tablica[nr][wr-2]<2) tablica[nr][wr-2]=3-2;
       case 8: if(tablica[nr+2][wr]<2) tablica[nr+2][wr]=3-2;
    }
    for(i=0; i<w; i++)
          {

            for(j=0; j<k; j++)

            cout<<setw(5)<<tablica[i][j];
            cout<<endl;
          }
    return 0;
}
 

Problem: switch działa tylko dla tablicy "tablica[0][0]" nie analizuje reszty np.

wejście 3 3

300

000

000

wyjście:

321

200

100

 

Z góry dziękuje za pomoc :)

 

2 odpowiedzi

+2 głosów
odpowiedź 31 stycznia 2017 przez draghan VIP (106,230 p.)
wybrane 1 lutego 2017 przez Scypyon
 
Najlepsza
Jak słusznie zauważyłeś, problem jest w switchu. Konstrukcja 'switch' nie ma w sobie nic magicznego - nie przeskoczy Ci samodzielnie po każdym indeksie w tablicy. Do tego musisz napisać odpowiednią pętlę.

Uwaga porządkowa: kod źródłowy wstawiamy w bloczek 'code'.
komentarz 5 lutego 2017 przez draghan VIP (106,230 p.)

Tak, chodzi o takie przetwarzanie tablicy. :)

Jednak nadal widzę błąd w Twoich warunkach, kiedy masz je ograniczyć z góry.

Jeśli chcesz zmienić komórkę tablica[i+1][j], to musisz sprawdzić,
czy i+1 <= w-1, a nie czy i <= w.

Wiesz w ogóle, skąd wynikają te warunki? Jeśli nie, to polecam przerobić jakiś kurs podstaw programowania w C++ - w tym wypadku chodzi o tablice i indeksy ich elementów oraz skutki ewentualnego przekroczenia zakresu tablicy przy zapisie.

komentarz 6 lutego 2017 przez Scypyon Gaduła (3,450 p.)
Moja wiedza z C++ opiera się na całym kursie Zelenta, znam teorię, zmieniłem tak jak mówisz i za Chiny nie wiem jak się tej 2 pozbyć :/
komentarz 6 lutego 2017 przez draghan VIP (106,230 p.)

Poprawiłem jedynie warunki bezpieczeństwa operacji tablicowych, sprawdź czy teraz działa poprawnie.

    for(int i = 0; i < w; i++)
    {
        for(int j = 0; j < k; j++)
        {
            if(tablica[i][j]==3)
            {
                if( (i - 1 >= 0) &&  (tablica[i-1][j] < 3))
                    tablica[i-1][j]= 2;
                if( (i+1 <= w-1) && (tablica[i+1][j] < 3))
                    tablica[i+1][j]= 2;
                if( (j - 1 >= 0) &&  (tablica[i][j-1] < 3))
                    tablica[i][j-1]= 2;
                if( (j+1 <= k-1) && (tablica[i][j+1] < 3))
                    tablica[i][j+1]= 2;
            }
        }
    }
    for(int i = 0; i < w; i++)
    {
        for(int j = 0; j < k; j++)
        {
            if(tablica[i][j]==2)
            {
                if( (i - 1 >= 0) &&  (tablica[i-1][j] == 0))
                    tablica[i-1][j]= 1;
                if( (i+1 <= w-1) && (tablica[i+1][j] == 0))
                    tablica[i+1][j]= 1;
                if( (j+1 <= k-1) && (tablica[i][j+1] == 0))
                    tablica[i][j+1]= 1;
                if( (j - 1 >= 0) &&  (tablica[i][j-1] == 0))
                    tablica[i][j-1]= 1;
            }
        }
    }

 

komentarz 6 lutego 2017 przez Scypyon Gaduła (3,450 p.)
Działa jak należy :D Dzięki bardzo za cierpliwość i pomoc :)
1
komentarz 7 lutego 2017 przez draghan VIP (106,230 p.)
Na zdrowie. ;)

Skoro już uczysz się o tablicach, to zapamiętaj sobie: tablica statyczna musi mieć rozmiar znany już w czasie kompilacji. To, co Ty zrobiłeś (czyli pobranie od użytkownika rozmiaru i utworzenie tablicy z tak otrzymanej liczby), jest niezgodne ze standardem. Musisz się tu posłużyć alokacją dynamiczną.
0 głosów
odpowiedź 31 stycznia 2017 przez obl Maniak (51,280 p.)

Nie widzę żeby zmienne wr i nr były zainicjalizowane wartościami.  Poza tym czy to tak ciężko wrzucić kod programu do bloku z kodem?

komentarz 31 stycznia 2017 przez Scypyon Gaduła (3,450 p.)
Jestem tu dopiero od wczoraj, przepraszam nie wiedziałem.
komentarz 31 stycznia 2017 przez draghan VIP (106,230 p.)

Nie widzę żeby zmienne wr i nr były zainicjalizowane wartościami.

Globale są inicjalizowane domyślnie - dla typu int jest to wartość zero.

Podobne pytania

0 głosów
0 odpowiedzi 407 wizyt
pytanie zadane 18 marca 2019 w HTML i CSS przez MrxCI Dyskutant (8,260 p.)
0 głosów
1 odpowiedź 716 wizyt
pytanie zadane 10 września 2017 w HTML i CSS przez pebrzosky Obywatel (1,160 p.)
0 głosów
3 odpowiedzi 5,517 wizyt
pytanie zadane 5 sierpnia 2015 w HTML i CSS przez iwan9449 Pasjonat (20,810 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!

...