Ricerca parole sulle diagonali di una matrice python

di lucertola39 il
3 risposte

Salve, mi servirebbe una mano con un problema python. In input ricevo N, M, matrice N*M, K ed un elenco di K parole. Nella matrice sono disposte tutte le parole ed il mio compito è di trovarle. Le parole possono essere in orizzontale, verticale e in diagonale, ma solo da sinistra verso destra. Ho pensato di fare un somma di stringhe con un ciclo innestato, sia per quanto riguarda le parole in orizzontale che in verticale, e di fatto funziona. Il problema però lo ho con le diagonali, in quanto non riesco a capire come dovrei impostare il ciclo per far sommare di volta in volta tutte le lettere presenti su ogni diagonale. Qualcuno ha un'idea?Grazie 

3 Risposte

  • 13/01/2023 - lucertola39 ha scritto:


    non riesco a capire come dovrei impostare il ciclo per far sommare di volta in volta tutte le lettere presenti su ogni diagonale.

    Posta il codice che hai scritto sino a questo momento per risolvere il problema, così possiamo esaminarlo e fornire eventuali suggerimenti.

  • Ciao, va bene, posto il codice, ma devi sapere che prima avevo ‘’semplificato'' ciò che mi chiedeva la traccia. Ora posto la traccia completa, che è più complessa di quello che io avevo scritto prima. 

    Questa è la traccia completa, e ora posto il mio codice.

    Ho ragionato in questo modo: mi sono creato(o almeno, questa è la mia intenzione) tre funzioni: una, che mi sostiuisce il carattere asterisco alle parole trovate in orizz, una che lo fa ma per le parole in vert, e un'altra che dovrebbe farlo in diagonale. Tutte e tre mi restituiscono la nuova matrice con gli asterischi al posto delle parole. Alla fine, faccio un controllo finale dove, se in una determinata posizione non è presente asteerisco in nessuna delle tre matrici, allora mi stampa il carattere in quella posizione. Come detto prima ,il problema lo ho con le parole in diagonale.

    def elenco(K):
        elenco=[]
        for i in range(K):
            elenco.append(input())
            
        return elenco
    
    
    def matrice(N,M):
        mat=[]
        for i in range(N):
            mat.append([])
            for j in range(M):
                mat[i].append(input())
    
        return mat
    
    def cercaRiga(mat,N,M,elenco):
        paroleCercate=[]
        somma=''
        for i in range(N):
            for j in range(M):
                somma+=mat[i][j]
                for k in range(len(elenco)):
                    if elenco[k] in somma and elenco[k] not in paroleCercate:
                        paroleCercate.append(elenco[k])
                        for h in range(j, j-len(elenco[k]),-1):
                            mat[i][h]='*'
            somma=''
                            
        return mat
    
    
    def cercaColonna(mat, N, M, elenco):
        paroleCercate=[]
        somma=''
        for i in range(M):
            for j in range(N):
                somma+=mat[j][i]
                for k in range(len(elenco)):
                    if elenco[k] in somma and elenco[k] not in paroleCercate:
                        print(somma)
                        paroleCercate.append(elenco[k])
                        for h in range(j, j-len(elenco[k]),-1):
                            mat[h][i]='*'
            somma=''
                            
        return mat
            
                
                       
    def main():
        N=int(input())
        M=int(input())
        mat=matrice(N,M)
        K=int(input())
        el=elenco(K)
    
    
    
        print(cercaDiagonale(mat, el,N, M))
    
    
    
    main()
    
  • Un po' tortuoso come sorgente. Io lo avrei buttato giù un po' così

    def cerca_parole(matrice, parole):
        direzioni = [
            lambda i, j, l: [(i, j+k) for k in range(l)],
            lambda i, j, l: [(i+k, j) for k in range(l)],
            lambda i, j, l: [(i+k, j+k) for k in range(l)],
            lambda i, j, l: [(i+k, j-k) for k in range(l)]
        ]
        for direzione in direzioni:
            for i in range(len(matrice)):
                riga = matrice[i]
                for j in range(len(riga)):
                    for lunghezza in range(1, len(riga)-j+1):
                        sottostringa = riga[j:j+lunghezza]
                        if sottostringa in parole:
                            for x, y in direzione(i, j, lunghezza):
                                matrice[x][y] = '*'
        return matrice
    
Devi accedere o registrarti per scrivere nel forum
3 risposte