Zadanie 'fangen' na SPOJu

0

Cześć usiłuje zrobić zadanko na SPOJa dokładniej FANGEN. Niestety pomimo moich starań i odczucia, że wszystko działa tak jak powinno, spoj odrzuca mi rozwiązanie z komunikatem "0 (threshold: 3)".
Niżej zamieszczam kod może jest ktoś w stanie wskazać mi błąd ,pomoc?
Z góry wielkie dzieki.

import java.util.*;
import java.lang.*;

import static java.lang.Math.abs;


class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int sets = Integer.parseInt(scanner.nextLine());
        int[] tab = new int[sets];
        for(int i =0;i<sets;i++){
            tab[i] = Integer.parseInt(scanner.nextLine());
        }
        for (int j =0 ; j<sets;j++){
            Fan fan = new Fan(sets,tab[j]);
        }



    }
}


class Fan {
    Scanner scanner = new Scanner(System.in);
    private int sets;
    private int fanSize;

    public Fan(int sets,int fanSize) {
        this.sets = sets;
        this.fanSize = fanSize;
        fanMaker(fanSize);
    }

    public void fanMaker(int fanSize) {

            int charSize = abs(fanSize);
            char[][] tab = new char[2 * charSize][2 * charSize];
            if (fanSize >= 0) {
                for (int j = 0; j < 2 * fanSize; j++) {
                    tab[j] = new char[200];
                    for (int k = 0; k < 2 * fanSize; k++) {
                        if (k == j || k + j == 2 * fanSize - 1 || (j < fanSize && k < fanSize && j > k) || (j < fanSize && k >= fanSize && j < 2 * fanSize - 1 - k)
                                || (j >= fanSize && k < fanSize && k > 2 * fanSize - 1 - j) || (j >= fanSize && k >= fanSize && j < k))
                            tab[j][k] = '*';
                        else tab[j][k] = '.';

                        System.out.print(tab[j][k]);
                    }
                    System.out.println();
                }

            }else
                for (int j=0; j<2*charSize; j++)
                {
                    tab[j]=new char [200];
                    for (int k=0; k<2*charSize; k++)
                    {
                        if (k==j || k+j==2*charSize-1 || (j<charSize && k<charSize && k>j)|| (j<charSize && k>=charSize && k>2*charSize-1-j)
                                || (j>=charSize && k<charSize && j<2*charSize-1-k) || (j>=charSize && k>=charSize && j>k))
                            tab[j][k]= '*' ;
                        else tab[j][k]='.';

                        System.out.print(tab[j][k]);
                    }
                    System.out.println();
                }
            System.out.println();
        }
}
1

Treść zadania:

Wejście
r1 [ -200 ≤ r1 ≤ 200, r1 <> 0; pierwsza liczba do przetworzenia ]
...
ri [ jw.; i-ta liczba do przetworzenia ]
0

[ można założyć, że przynajmniej pierwsza wartość będzie niezerowa, tj. że i ≥ 1 ]

Co oznacza że, na wejściu program ma dostawać liczby, aż zobaczy 0. Nie tak jak u Ciebie że ustalasz ile zestawów danych.

Działanie poprawnego programu dla danych [5, -5, 0]:

  1. Podajesz wejście 5 = wyświetla lewoskrętny wiatraczek.
  2. Podajesz wejście -5 = wyświetla prawoskrętny wiatraczek.
  3. Podajesz wejście 0 = kończy program.

Działanie Twojego programu dla danych [5, -5, 0]:

  1. Ustawia liczbę zestawów danych na 5. *
  2. Dostaje wejście -5 = tworzy wiatraczek prawoskrętny.
  3. Dostaje wejście 0 = ???????
  4. Nie ma więcej wejść.

*Dodatkowo tutaj się crashuje, przy konwersji na int. Zamiast wczytywać linie i konwertować na inta, możesz po prostu użyć scanner.nextInt();.

Czyli jeszcze raz krótko schemat programu.

while (true) {
			int rozmiarWiatraczka= scanner.nextInt();


			if (rozmiarWiatraczka< 0) {
				rysujPrawoskretnyWiatrak();

			} else if (rozmiarWiatraczka> 0) {
				rysujLewoskretnyWiatrak;

			} else if
				break;
		}
1

przede wszystkim sprawdz przykladowe dane testowe, nawet one nie dzialaja. wez pod uwage ze masz skonczyc wczytywanie przypadkow testowych gdy napotkasz 0
jako bonus szkielet rozwiazania do takiego typu wejscia:

import java.util.Optional;
import java.util.Scanner;
import java.util.stream.IntStream;

class Main {

    private static Optional<String> getFan(int n) {
        if (n == 0) {
            return Optional.empty();
        }
        throw new RuntimeException("not implemented!"); //tu sobie zbuduj wiatrak
    }

    private static void printFan(Optional<String> fan) {
        if (fan.isPresent()) {
            System.out.println(fan.get());
        } else {
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        IntStream.generate(new Scanner(System.in)::nextInt).mapToObj(Main::getFan).forEach(Main::printFan);
    }
}
0

Dziękuje !! Tak długo siedziałem nad tym zadaniem, że przestałem patrzyć na treść.

1 użytkowników online, w tym zalogowanych: 0, gości: 1