Linguaggio C: trovare matrice all'interno di un'altra matrice

maddiii
Ciao a tutti!
Devo scrivere un programma per verificare la presenza di una matrice MxM all'interno di un'altra matrice di dimensione maggiore NxN. Secondo voi il programma che ho scritto è corretto?? Grazie a chi volesse aiutarmi :D

#include <stdio.h>
#include <stdlib.h>
#define N 9
#define M 3

int main()
{
int i,j,k,h,flag;
int matrice1[N][N], matrice2[M][M];

for(i=0;i<N-M+1;i++){
    for(j=0;j<N-M+1;j++){
            flag=1;

    for(k=0 && flag==1;k<N;k++){
            for(h=0 && flag==1;h<M;h++){

        if(matrice1[i+k][j+h]!=matrice2[k][h])
            flag=0;
              }
            }
          }
       }

    if(flag==1){
    printf("match a partire dalla posizione %d %d \n",i,j);
    }

else{
    printf("no match");
   }
    return 0;
}

Risposte
vict85
Il principio generale mi sembra corretto, a parte per la mancanza della inizializzazioni delle matrici, e il fatto che hai scritto la condizione sul flag nelle assegnazioni invece che nelle condizioni del for. Il compilatore non ti dà warning o errori?

maddiii
ah già! non sono inizializzate perché in realtà questa è solo una parte dell'intero esercizio..
comunque nè warning nè errori ma non mi funziona :cry: :|

Super Squirrel
Conoscendo solo le basi del c++ mi risulta difficile capire dove si trova l'errore, quindi ti posto il programma che ho fatto (sembra funzioni), così magari riesci a capire dove sbagli.

#include <iostream>

using namespace std;

void inserisci_matrice(int a, int v[20][20], int b)
{
    for(int i = 0; i < a; i++)
    {
        cout << endl;
        for(int j = 0; j < a; j++)
        {
            cout << "v" << b << "[" << i << "][" << j << "] = ";
            cin >> v[i][j];
        }
    }
}

void mostra_matrice(int a, int v[20][20], int b)
{
    cout << endl << "v" << b << ":" << endl;
    for(int i = 0; i < a; i++)
    {
        cout << endl;
        for(int j = 0; j < a; j++)
        {
            cout << v[i][j] << "\t";
        }
    }
    cout << endl;
}

int main()
{
    int N, M, v1[20][20], v2[20][20], conta = 0;
    bool x;
    cout << "N = ";
    cin >> N;
    cout << "M = ";
    cin >> M;
    inserisci_matrice(N, v1, 1);
    inserisci_matrice(M, v2, 2);
    mostra_matrice(N, v1, 1);
    mostra_matrice(M, v2, 2);
    for(int i = 0; i < N - M + 1; i++)
    {
        for(int j = 0; j < N - M + 1; j++)
        {
            x = 0;
            if(v1[i][j] == v2[0][0])
            {
                x = 1;
                for(int k = 0; k < M; k++)
                {
                    for(int q = 0; q < M; q++)
                    {
                        if (v1[i + k][j + q] != v2[k][q])
                        {
                            x = 0;
                            break;
                        }
                    }
                    if (x == 0)
                    {
                        break;
                    }
                }
            }
            if (x == 1)
            {
                conta++;
            }
        }
    }
    cout << endl << "Numero di volte che v2 e' contenuta in v1: " << conta;
}

_Fra116
A prima vista saltano all'occhio un paio di errori. Ti direi di dare un'occhiata ai loops :




Inoltre non capisco se tu voglia verificare la presenza della sotto matrice o anche se è contenuta più volte, perché a questo punto dovesti o utilizzare delle variabili per segnarti la posizione dell'inizio della sotto matrice o spostare il printf all'interno dei primi 2 loops.

Spero che ti sia utile :)

maddiii
grazie mille a tutti! :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.