проверка совпадения чисел по диагоналям в матрице

Определить, сколько в нем пар соседних одинаковых элементов. Элементы считаются соседними, если их индексы в столбцах и/или в строках различаются не более чем на единицу. Но как проверить числа на то, что они одинаковые, если расположены на диагоналях? Подумал сразу, чтобы добавить такие же циклы, как и в коде, но с 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 шт):

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

Важно учитывать, что оба элемента входящие в пару являются членами одной пары, поэтому принцип сравнения стоит выбирать с учётом этого.

Ваш текущий принцип обхода (для внутренних элементов):

о _ _
_ @ о
_ о о

Накладывая такую маску на каждый отмеченный о элемент, нужно следить, чтобы новые символы о не попали на предыдущий исходный элемент @. При этом маска помещённая в пустые клетки должна зацеплять исходный элемент символом 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.

→ Ссылка