Algoritmo ricerca sequenza nella matrice

di il
1 risposte

Algoritmo ricerca sequenza nella matrice

Salve a tutti, chiedo un piccolo aiuto per la risoluzione di questo problema:

Realizzare un algoritmo che data una matrice M(n, n)di numeri ed una sequenza di numeri S(m) m<n, sia capace di individuare tra gli elementi di M quelli da cui parte la sequenza S procedendo in orizzontale (0). Se K sono gli elementi individuati, costruire partendo da essi, la matrice A(K,3)in cui ogni riga contiene gli indici del corrispondente elemento (colonna 1 e 2) e la direzione (colonna 3)0 in cui la sequenza S si sviluppa.

Questo è il mio codice, però ho qualche problema, sarei molto grato se qualcuno mi aiutasse, grazie mille.

% [M,n]=input_matrice();
M=[5,1,7,3,1,1,0,9; 1,7,7,6,7,1,7,0; 5,3,1,3,1,7,3,0; 0,8,0,3,0,5,3,0; 0,9,5,8,7,5,0,5; 1,7,5,8,0,1,6,0; 7,8,0,7,4,3,7,0; 3,0,0,4,4,0,0,3];
n=8;

[S,m]=input_sequenza(n);

M
S

A=trova(M,S,n,m);

A

% function [M,n]=input_matrice()
% n=input('Inserisci ordine matrice: ');
% 
% M=zeros(n);
% 
% for i=1:n
%     for j=1:n
%         fprintf('Inserisci elemento in posizione %d %d :', i, j);
%         M(i,j)=input(' ');
%     end
% end
% end
 
function [S,m]=input_sequenza(n)
m=n+1;
while m>n
m=input('Inserisci lunghezza sequenza: ');
end

for i=1:m
    fprintf('Inserisci elemento in posizione %d:', i);
    S(i)=input(' ');
end
end

function A=trova(M,S,n,m)
trovato=0;
k=0;
for i=1:n
    a=1;
    for j=1:n
        if S(a)==M(i,j)
            trovato=1;
            if m>1
                b=j;
                for a=2:m
                    b=b+1;
                    if S(a)~=M(i,j)
                        trovato=0;
                    end
                end
            end
        end
        if trovato==1
            k=k+1;
            A(k,1)=i;
            A(k,2)=j;
            A(k,3)=0;
        end
    end              
end
if trovato==0
    A='Nessuna sequenza trovata';
end
end

1 Risposte

  • Re: Algoritmo ricerca sequenza nella matrice

    Una possibile soluzione potrebbe essere:
    [*] creare due loop annidati per scorrere la matrice di input per righe e colonne
    [*] ad ogni iterazione del loop interno, verificare se l'n-esimo elemento della matrice è uguale al primo elemento della sequenza
    [*] se la condizione è verificata
    [*] calcolare la differenza tra gli elementi della sequenza ed il corrispondente numero di elementi della riga / colonna della matrice
    [*] sommare i valori assoluti delle differenze
    [*] se la somma è uguale a 0, la sequenza è stata trovata

    Di seguito una possibile implementazione, per trovare una data sequenza nelle quattro direzioni: da sinistra a destra, da destra a sinistra, dall'alto in basso e dal basso in alto.

    L'approccio è sempre lo stesso per i quattro casi, basta "giocare" con gli indici dei loop per adattarli alla direzione di ricerca.
    La matrice di input è stata modificata per inserire la sequenza nelle diverse direzioni.
    
    % [M,n]=input_matrice();
    M=[5,1,7,3,1,1,0,9;
       1,7,7,6,7,1,7,0;
       5,3,1,3,1,7,8,0;
       0,8,0,3,0,5,0,3;
       0,9,5,8,7,5,3,0;
       1,7,5,8,0,1,0,8;
       7,8,0,3,0,8,7,0;
       3,0,0,4,4,0,0,3]
    
    [n_row,n_col]=size(M);
    
    seq=[8 0 3 0];
    seq_len=length(seq);
    %
    % Initialize the counter
    %
    cnt=0;
    %
    % Search for the sequence from LEFT to RIGHT
    %
    % Loop over the row
    %
    for i=1:n_row
       % Loop over the columns
       for j=1:n_col-seq_len+1
          % If the first element matches the beginning of the sequence
          if(M(i,j) == seq(1))
             % Evaluate the absoluta value of the element wise difference between the sequence and the matrix token
             % If sum of the differences is equal to 0 the sequence has been found
             if(sum(abs(M(i,j:j+seq_len-1)-seq)) == 0)
                % Increment the counter
                cnt=cnt+1;
                % Assign the data to the output matrix
                A(cnt,1:3)=[i j 0];
             end
          end
       end
    end
    %
    % Search for the sequence from RIGHT to LEFT
    %
    seq=flip(seq)
    for i=1:n_row
       for j=1:n_col-seq_len+1
          if(M(i,j) == seq(1))
             if(sum(abs(M(i,j:j+seq_len-1)-seq)) == 0)
                 cnt=cnt+1;
                 A(cnt,1:3)=[i j 1];
             end
          end
       end
    end
    %
    % Search for the sequence from UP to DOWN
    %
    seq=flip(seq)'
    for i=1:n_col
       for j=1:n_row-seq_len+1
          if(M(j,i) == seq(1))
             if(sum(abs(M(j:j+seq_len-1,i)-seq)) == 0)
                 cnt=cnt+1;
                 A(cnt,1:3)=[i j 2];
             end
          end
       end
    end
    %
    % Search for the sequence from Down to Up
    seq=flip(seq)
    for i=1:n_col
       for j=1:n_row-seq_len+1
          if(M(j,i) == seq(1))
             if(sum(abs(M(j:j+seq_len-1,i)-seq)) == 0)
                 cnt=cnt+1;
                 A(cnt,1:3)=[i j 3];
             end
          end
       end
    end
    
    A
    
Devi accedere o registrarti per scrivere nel forum
1 risposte