проверка совпадения чисел по диагоналям в матрице
Определить, сколько в нем пар соседних одинаковых элементов. Элементы считаются соседними, если их индексы в столбцах и/или в строках различаются не более чем на единицу. Но как проверить числа на то, что они одинаковые, если расположены на диагоналях? Подумал сразу, чтобы добавить такие же циклы, как и в коде, но с a[i+1][j+1]+добавить к этому условие на то, чтобы не выходить за рамки матрицы. Но после понял, что одним добавленным циклом не обойдешься, и все элементы не проверятся, т.к. проверяются они сверху вниз(допустим a[0][0] и a[1][1]). Но как сделать, например с матрицей 3х3, корректное сравнивание элементов, которые стоят под индексами a[0][0] и a[1][1] наоборот и + еще один случай с другой диагональю: a[0][1] и a[1][0], не выходя за рамки матрицы?
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
int main()
{
srand(time(NULL));
const int n = 3;
const int m = 3;
setlocale(LC_ALL, "Rus");
printf("Заполните массив:\n ");
int a[n][m];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
//printf("a[%d][%d] = ", i, j);
//scanf("%d", &a[i][j]);
a[i][j] = rand() % 10;
}
}
int k=0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (i < n - 1 && a[i][j] == a[i + 1][j]) k++;
if (j < m - 1 && a[i][j] == a[i][j + 1]) k++;
if((i>0 && j>0) || (j<m-1 && i<n-1))
{
if (a[i][j]==a[i+1][j+1]) k++;
else if(a[i][j]==a[i-1][j-1])k++;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
printf("Количество пар с соседними элементами: %d", k);
return 0;
}
Ответы (1 шт):
Важно учитывать, что оба элемента входящие в пару являются членами одной пары, поэтому принцип сравнения стоит выбирать с учётом этого.
Ваш текущий принцип обхода (для внутренних элементов):
о _ _
_ @ о
_ о о
Накладывая такую маску на каждый отмеченный о элемент, нужно следить, чтобы новые символы о не попали на предыдущий исходный элемент @. При этом маска помещённая в пустые клетки должна зацеплять исходный элемент символом o, чтобы учесть наличие пары. Здесь элементы на диагонали учитываются дважды, а в верхнем правом углу не учитывается пара с основным элемкнтом.
Эти проблемы можно решить немного изменив маску, например так:
_ _ о
_ @ о
_ о о
Теперь видно какие элементы нужно смотреть для подсчёта пар:
j-1 j j+1
i-1 _ _ _
i _ _ _
i+1 _ _ _
И соответственно код:
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
{
if (i < n-1 && a[i][j] == a[i + 1][j]) k++;
if (i < n-1 && j < m-1 && a[i][j] == a[i + 1][j + 1]) k++;
if (j < m-1 && a[i][j] == a[i][j + 1]) k++;
if (i > 0 && j < m-1 && a[i][j] == a[i - 1][j + 1]) k++;
}
}
Подозреваю, что вы понимали большую часть написанного, но посмотрите, как визуализация всё упрощает.
Помимо этого можно проверять все пары, т.е. :
о о о
о @ о
о о о
А потом, т.к. нам известно, что все пары учтены дважды, разделить результат на 2.