Aiuto per principiante

di il
3 risposte

Aiuto per principiante

Salve a tutti,
mi è stato assegnato un esercizio da risolvere ma mi sto accorgendo che è superiore alle mie conoscenze. ve ne pubblico il testo


State lavorando ad un progetto per la realizzazione di schemi di parole crociate e vi viene chiesto di realizzare una funzione, in linguaggio C++, che stampi tutte le parole, orizzontali e verticali, presenti nel cruciverba che le viene passato.
In particolare il cruciverba è costituito da una matrice di caratteri di R righe e C colonne dove le caselle nere sono rappresentate dal carattere '*' e vi viene richiesto di numerare le parole di almeno due lettere in modo progressivo partendo dalla cella di coordinate [0,0] e procedendo da sinistra a destra e dall’alto verso il basso e stampare, per ogni numero, le parole trovate, le coordinate d’inizio (riga e colonna) e la loro direzione (orizzontale, verticale o entrambe).

Ad esempio, ricevendo la seguente matrice

ABI*I
TO*ER
OBAMA
S**IQ
la funzione deve numerare le parole come indicato di seguito (il numero di ciascuna parola è associato alla cella contenente la prima lettera della parola, sia essa orizzontale o verticale)
e stampare il seguente risultato:
Posizione 1: riga 0, colonna 0 verticale ATOS orizzontale ABI Posizione 2: riga 0, colonna 1 verticale BOB
Posizione 3: riga 0, colonna 4 verticale IRAQ
Posizione 4: riga 1, colonna 0 orizzontale TO
Posizione 5: riga 1, colonna 3 verticale EMI orizzontale ER Posizione 6: riga 2, colonna 0 orizzontale OBAMA
Posizione 7: riga 3, colonna 3 orizzontale IQ

Chiaramente la funzione non deve considerare spezzoni di parole contenute in altre parole (ad esempio BI, BAMA, AMA, MA, ecc.).
Si tenga presente che l’unico effetto della funzione è quello di stampare l’elenco come richiesto (non è richiesto di introdurre il numero della posizione della parola all’interno delle celle della matrice).
Si realizzi anche un semplice main() per testare la funzione implementata.



Non ho veramente idea di come muovermi..
Specialmente non so come andare a verificare che una tale porzione di testo non sia già stata utilizzata in altre soluzioni..

Grazie infinite a chiunque potrà aiutarmi...

3 Risposte

  • Re: Aiuto per principiante

    Come aiutarti? Hai provato a scrivere qualcosa su cui discutere?
  • Re: Aiuto per principiante

    Prova intanto ad acquisire i dati.
    Poi scrivi due vettori di appoggio orizzontali e verticali.
    Scrivi una funzione che, con doppio ciclo, ti numera gli orizzontali e verticali; segni sui vettori di appoggio le coordinate.
    Ingegniati un po' e vedrai che riuscirai, fai vedere quello che hai fatto e vedrai che qualcuno di aiuterà se hai difficoltà.
  • Re: Aiuto per principiante

    Scusate, sono davvero alle prime armi.. mi rendo conto che senza codice sia difficle venirmi incontro intanto grazie per la disponibilità.

    Qui c'è il modo in cui, finora, ho risolto il problema.
    Pare che la funzione svolga esattamente ciò che viene richiesto, ma sono sicuro che ci sia un modo più elegante senza tutte queste condizioni nell' if.. spero nell'aiuto di qualcuno piu esperto
    #include <iostream>
    #include <string>
    using namespace std;
    
    #define RIGHE 4                // Costanti delle dimensioni
    #define COLONNE 5              // del cruciverba[/size]
    
    
    void stampaParole (string cruciverba[])
         {
         int colonna,riga,j,k,posizione = 0;
         for (riga=0; riga < RIGHE; riga++)                       
             {                                                     
             for (colonna=0; colonna < COLONNE; colonna++)         
                 {
                 if (cruciverba [colonna][riga] != '*'                             
                     && ((cruciverba [colonna+1][riga] != '*'                      
                       && colonna+1 < COLONNE                                      
                       && (cruciverba [colonna-1][riga] == '*'|| colonna == 0))    
                     ||  (cruciverba [colonna][riga+1]!= '*'    
                       && riga+1 < RIGHE
                       && (cruciverba [colonna][riga-1] == '*' || riga == 0))))
                    {
                    posizione++;                                                   /
                    cout << endl << "Posizione " << posizione << ": riga " << riga << ", colonna " << colonna ;    
                    if (cruciverba [colonna][riga+1] != '*'                          
                       && (cruciverba [colonna][riga-1] == '*' || riga == 0)        
                       && riga+1 < RIGHE)                                            
                       {
                       cout << " verticale ";
                       k = riga;
                       while (cruciverba [colonna][k] != '*' && k < RIGHE)
                             {
                             cout << cruciverba [colonna][k];
                             k++;
                             }
                       }
                    if (cruciverba [colonna+1][riga] != '*'                        
                       && (cruciverba [colonna-1][riga] == '*' || colonna ==0)       
                       && colonna+1 < COLONNE )                                     
                       {
                       cout << " orizzontale ";
                       j = colonna;
                       while (cruciverba [j][riga] != '*' && j < COLONNE)
                             {
                             cout << cruciverba [j][riga];
                             j++;
                             }
                       }
                    }
                 }
             }
         }
             
             
        
                    
                    
        
        int main () {
        
                string cruciverba[COLONNE] = {"ATOS","BOB*", "I*A*", "*EMI", "IRAQ"};  
            
                string cruciverba1[COLONNE] = {"*B*N","CANE","I*ER","ATVI","OIE*"};
        
                stampaParole(cruciverba);
          
                stampaParole(cruciverba1);
        
                return 0;
            
                    }
    

    avevo messo anche i commenti ma poi si è sformattato tutto, aiuto sono una frana

    in sostanza la funzione prende la matrice, poi verifica una cella alla volta e vede se è un punto di partenza valido per nuove parole (tramite le 8000 condizioni che ho messo nell'If), dopodichè ripete la verifica solo per verticale e nel caso stampa, e idem in orizzontale.

    Vorrei una soluzione più pulita, ma non saprei in che modo.. un array tridimensionale per la soluzione? una struttura? sigh
    grazie ragazzi scusate davvero la niubbaggine
Devi accedere o registrarti per scrivere nel forum
3 risposte