9 / 17
Oct 2017

http://pl.spoj.com/problems/FANGEN/34

AC ale na 3 punkty, dlaczego tylko tyle?
kod:

Summary

include

using namespace std;
char wiatrak[10001][10001];

int abse(int a)
{
    if (a>0)
        return a;
    else return -a;
}

int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int a;

while(cin>>a)
{
    if(a==0)
        return 0;
    int mem=a;
    a=abse(a);

    for(int i=0; i < a  ; i++)
    {
        for(int j=i; j < a; j++)
        {
            wiatrak[i][j]='*';
        }
         for(int j=a*2; j >= a*2-i-1 ; j--)
        {
            wiatrak[i][j]='*';
        }

    }
    int k=1;
    for(int i=a; i < a*2  ; i++)
    {

        for(int j=0; j < i-a+1; j++)
        {
           wiatrak[i][j+a]='*';
        }
    for(int j=0; j < a*2-i  ; j++)
       {
           wiatrak[i][j]='*';

       }


    }
    for(int i=0; i < a*2  ; i++)
        {
            for(int j=0; j < a*2; j++)
            {
                if(wiatrak[i][j]!='*')
                   {

                   wiatrak[i][j]='.';
                   }
            }
        }


  if(mem<0)
     {
         for(int i=0; i < a*2  ; i++)
        {
            for(int j=0; j < a*2; j++)
            {

                     cout<<wiatrak[i][j];
                     wiatrak[i][j]=' ';

            }
            cout<<endl;
        }
     }
     else
     {
           for(int i=a*2-1; i >= 0  ; i--)
            {
                for(int j=a*2-1; j >= 0; j--)
                {

                    cout<<wiatrak[j][i];
                    wiatrak[j][i]=' ';

                }
                cout<<endl;
            }



    }
    cout<<endl;

}
return 0;

}

  • created

    Jul '17
  • last reply

    Feb '18
  • 16

    replies

  • 2.0k

    views

  • 6

    users

  • 7

    likes

  • 3

    links

to może po prostu wygeneruj sobie kilka niedużych wiatraczków i obejrzyj

następny z kłopotami ze wzrokiem ? :slight_smile:

obejrzałeś dokładnie ?

Widocznie tak :smiley: Wypisałem każdy od 1 do 20 i nie widzę błędu, mniejsza, niech już zostaną te 3 punkty :cry:

Ciekawe, nie zawsze są złe wyniki, efekt zależny od sekwencji wejściowej :slight_smile:

sprawdź taką sekwencję:

1
2
1
3
2
3
3
0

niby taki sam, a jednak inny

3 months later

Mam tak jak kolega wyżej, wiatraczki działają, ale tylko przy odpowiednich sekwencjach, zawsze dobrze, gdy wywołuje się pojedynczo. Czy ktoś ma pomysł dlaczego przy wpisywaniu kilka razy tej samej wartości r otrzymuję różne wyniki?
Kod: [usunięty]

Screenshot:

Powód może być jeden: zostają Ci jakieś dane z poprzednich testów. Gdy tworzysz tablicę dynamiczną rezerwujesz pewien obszar w pamięci, ale kompilator sam go nie wyzerowuje. Dlatego gdy odnosisz się do indeksów, których nie ustawiłeś możesz spotkać wszystko. W szczególności też ‘*’. Zwłaszcza gdy ktoś przed chwilą zwonił kawałek pamięci, w których ich było całkiem sporo… :slight_smile:

PS. Na spoju zazwyczaj możesz zignorować czyszczenie pamięci, jednak jest to oczywiście dobra praktyka. Możesz też użyć wektorów.
PS2. Jak już czyścisz pamięć to rób to dobrze. Te instrukcje powinny być odwrotnie:

    //usuwanie tablicy dynamicznej
    delete[] wiatrak;
    for(int k=0;k<2*r;k++)
        delete [] wiatrak[k];

Instrukcje zamieniłem, mój błąd, jednak nie rozumiem, w którym momencie odnoszę się do indeksów, których nie ustawiłem?

Dlatego gdy odnosisz się do indeksów, których nie ustawiłeś możesz spotkać wszystko. W szczególności też ‘*’. Zwłaszcza gdy ktoś przed chwilą zwonił kawałek pamięci, w których ich było całkiem sporo…

Nie do końca rozumiem ten fragment, mógłbyś to wyjaśnić?

Deklarujesz tablicę dynamiczną, a potem niektórym jej elementom przypisujesz ‘*’. Te dla których tego nie zrobiłeś mają wartość nie ustaloną (jest tam to co akurat było w zajętej pamięci, teoretycznie może być wszystko). To są właśnie te indeksy o których mówię.

Następnie iterujesz po całej tablicy i sprawdzasz czy bieżący element ma wartość ‘*’. Może się zdarzyć, że dla elementów które miały wartość nieustaloną jest tam właśnie ‘*’, przez co ją wypisujesz.

Program alokuje pamięć, która częściowo pokrywa się z tą, którą zwolniłeś przez co występuje taki efekt.

Dzięki, nie pomyślałem o tym. Dodałem pętle zerujące całą tablicę zaraz po stworzeniu jej i w konsoli wszystko wygląda ładnie, jednak sędzia odrzuca, daje mi 0 punktów.

Testowałem program również dla wartości granicznych tj. 200 oraz -200 z zapisem do pliku i też wygląda na to, że działa poprawnie.

Obecny kod: [usunięty]

Wejście

r1 [ -200 ≤ r1 ≤ 200, r1 <> 0; pierwsza liczba do przetworzenia ]

Dzięki wielkie, wynik maksymalny, spoj przyzwyczaił do standardowej pętli i nawet nie sprawdziłem czy tu jest inaczej.

3 months later

Czy ktoś wie jakie testy robi sędzia? Sprawdziłem u siebie już wiele wartości i zawsze jest ok a ten mi daje 0 pkt. :confused: Format danych jest dokładnie taki jak w treści zadania, program przyjmuje kolejne wartości w nowych liniach aż wpisze się zero, wtedy drukuje wiatraki pooddzielane pustymi linijkami.

No zgodnie ze specyfikacją zadania musisz być gotowy na dane z zakresu -200 do 200 i zakończyć po otrzymaniu 0. Czy twój program daje prawidłowe wyniki na ideone.com26 dla wejście spod zadania?

Jednak moja wina była, właśnie wszedłem w temat żeby usunąć to pytanie ale już zdążyłeś odpowiedzieć.