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