Come gestire i set di dati "X" come input

3

Oggi ho partecipato a una competizione di codifica e ho scoperto che quasi tutti gli input da riga di comando dei nostri programmi necessari per la ricezione inizieranno con un numero intero che rappresenta la quantità di serie di dati da seguire. C'erano 6 problemi diversi, e tutti sono partiti in questo modo.

Ad esempio, un problema di esempio ha avuto: "L'input per questo problema inizierà con una riga contenente un singolo intero N (1 < = N < = 100) che indica il numero di set di dati. Ogni set di dati è costituito dai seguenti componenti:

  • Una riga contenente un intero intero W che specifica il numero di wormholes
  • Una serie di linee W contenenti ....
  • ecc. "

Praticamente tutti i problemi di concorrenza hanno questo formato, con il primo intero che rappresenta la quantità di serie di dati da seguire.

La mia reazione iniziale (e il modo in cui ho provato a risolvere il problema) stava usando un vettore di dimensione N, in cui ogni elemento rappresentava un set di dati. Il problema è che ci sono un sacco di cose in questi set di dati. L'utilizzo di questo approccio mi ha spesso lasciato con un vettore di vettori (forse un'esagerazione, ma si ottiene l'idea) che era molto difficile da gestire.

Un'altra idea è stata la ripetizione dell'intero programma N volte, ma questo non sembra sempre applicabile.

Mi rendo conto che questa è una domanda vaga, ma è perché sto cercando una soluzione generale a questo tipo di problema. Qual è l'approccio migliore per gestire questo tipo di input?

    
posta Casey Patton 30.10.2011 - 02:55
fonte

4 risposte

1

Non penso che ci sia un'altra opzione oltre a quelle che hai menzionato. Entrambi:

a) scorrere tutti i set di dati e lavorare su di essi man mano che vengono visualizzati

o

b) memorizza tutto (in una struttura dati adeguata, come un array, una tabella hash, un albero, ecc.) e lavora su di esso più tardi.

    
risposta data 30.10.2011 - 03:05
fonte
1

Di solito definisco una classe per rappresentare ogni istanza di problema, quindi aggiungo un costruttore di classi che accetta un FileReader o un istream. In realtà, risolvo problemi come questi in Perl, ma le regole del contest richiedono Java o C ++.

    
risposta data 31.10.2011 - 01:16
fonte
0

Stai cercando una soluzione approssimativamente generalizzata ... quindi prova un po 'di generalizzazione. Guarderei creare una classe o una collezione personalizzata per rappresentare i requisiti / le funzionalità comuni.

Qualcosa come:

static void Main(string[] args)
{
    int itemCount = int.Parse(Console.ReadLine());
    var samples = new SampleData<Sample<int>, int>();
    samples.Read(Console.In, itemCount);
}

public class SampleData<T, K> : List<T>
    where T : Sample<K>, new()
{
    public void Read(TextReader reader, int count)
    {
        for (int i = 0; i < count; i++)
        {
            T sample = new T();
            sample.LoadData(reader.ReadLine());

            this.Add(sample);
        }
    }
}

public class Sample<T>
{
    public List<T> dataPoints { get; set; }

    public Sample()
    {
        this.dataPoints = new List<T>();
    }

    public void LoadData(string data)
    {
        /* parse data and add to dataPoints */
    }
}
    
risposta data 31.10.2011 - 02:05
fonte
0

La soluzione più comune che ho usato era scrivere una funzione che potesse leggere 1 set di dati da un file di input e risolverlo. Quindi, nel ciclo principale, avrei letto la prima riga, estratto quanti set di dati esistevano e chiamato for(1..N) {Solve(inputfile);}

Non ho inserito tutti i problemi in una singola struttura dati, perché ogni set di dati era un input autonomo. Il fatto che siano tutti nello stesso file è solo una comodità.

    
risposta data 31.10.2011 - 13:25
fonte

Leggi altre domande sui tag