Сравнение двумерных массивов
Задача: найти вхождение одного двухмерного массива в другой и возвратить координаты вхождения
Подскажите как исправить, выводит координаты только первого элемента
#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
→ Ссылка
Подскажите как исправить, выводит координаты только первого элемента
потому что код у вас неправильно написан и работает
вот что происходит:
- ищется первый элемент подмассива
код:
for (int i = 0; i < n1 - n2; i++) {
for (int j = 0; j < m1 - m2; j++) {
if (a[i][j] == b[0][0]) {
// некий анализ
}
}
}
- если анализ был успешным, то вывести левую верхнюю координату блока:
код:
if (!bad) cout << i << "," << j << std::endl;
т.е. вы выводите только 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 и по подмассиву