Сравнение двумерных массивов

Задача: найти вхождение одного двухмерного массива в другой и возвратить координаты вхождения

Подскажите как исправить, выводит координаты только первого элемента

#include <iostream>

using namespace std;
 
int main(){
    const int n1 = 8;
    const int n2 = 2; 
    const int m1 = 8;
    const int m2 = 2;
    int a[n1][m1] =  {
    {1, 2, 3, 4, 5, 6, 7, 8},
    {6, 3, 4, 5, 6, 7, 8, 9},
    {1, 7, 2, 9, 3, 7, 3, 2},
    {6, 2, 4, 5, 6, 7, 0, 2},
    {5, 3, 3, 7, 3, 2, 5, 2},
    {1, 8, 2, 5, 1, 9, 0, 0},
    {0, 9, 2, 5, 6, 7, 2, 1},
    {2, 0, 3, 0, 6, 2, 5, 7}
    };
    int b[n2][m2] ={
        {1,2},
        {6,3}
    };

    int k,l;//строка, столбец
    bool bad;
    for (int i = 0; i < n1 - n2;i++){
        for (int j = 0; j < m1-m2; j++){
            if (a[i][j] == b[0][0]) {
                
                bad = false;
                k = 0;
                do {
                    l = 0 ; 
                    do {
                        if (a[i+k][j+l] != b[k][l]) bad = true;
                        l++;
                    } while (l > m2 || bad);
                    k++;
                } while (k >n2 || bad);
            if (!bad) cout << i << ","<< j << " ";        
            }
        
        }
        
    }




    return 0;
}    

Ответы (1 шт):

Автор решения: Zhihar

Подскажите как исправить, выводит координаты только первого элемента

потому что код у вас неправильно написан и работает

вот что происходит:

  1. ищется первый элемент подмассива

код:

for (int i = 0; i < n1 - n2; i++) {
    for (int j = 0; j < m1 - m2; j++) {
        if (a[i][j] == b[0][0]) {
            // некий анализ
        }
    }
}
  1. если анализ был успешным, то вывести левую верхнюю координату блока:

код:

if (!bad) cout << i << "," << j << std::endl;

т.е. вы выводите только 1 координату, что же вы еще ожидаете? что закодили, то и получили

  1. теперь смотрим сам код анализа -

а он сводится к тому, что у вас успех уже после проверки первого столбца и все - поэтому вместо 1 подмассива у вас находится сразу 4

k = 0;
do {
    l = 0;
    do {
        if (a[i + k][j + l] != b[k][l]) bad = true;
        l++;
    } while (l > m2 || bad);
    k++;
} while (k > n2 || bad);

вот эти while вообще некорректны

Что вам мешает решить в лоб: сделать двойной for и по подмассиву

→ Ссылка