двумерный массив и соседние элементы в нем

есть у нас массив(размер не важен), задача стоит такая: Определить, сколько в нем пар соседних одинаковых элементов. Элементы считаются соседними, если их индексы в столбцах и/или в строках различаются не более чем на единицу. Задача показалась изначально не сложной, но после нескольких часов думок убедился в обратном. Внимание, код:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
    const int n = 4;
    const int m =4;
    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_s("%d", &a[i][j]);
            a[i][j] = rand() % 10;
        }
    }
    int k=0;
    for (int i = 1; i < n-1; i++)
    {
        
        for (int j = 1; j < m; j++)
        {
            if (a[i][j] == a[i + 1][j]) {
                k++;
            }
        }
    }
    for (int i = 1; i < n; i++)
    {

        for (int j = 1; j < m-1; j++)
        {
            if (a[i][j] == a[i][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("k=%d", k);
    return 0;
}

Честно говоря, шестеренки в голове уже заели, и сам найти ошибку не в силах

пример:су

сам сейчас задумался, а сколько же тут пар одинаковых чисел, подсчитал, что 10, но выводит 6, что будет правильным ответом, если считать пары только горизонтально. Думаю, что в этом как раз и ошибка, но как точно проверить нижнее или верхнее число n-го элемента матрицы?


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

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

Чутка переписал алгоритм - просто пробегаю по матрице и проверяю пару справа и снизу (когда есть ячейка справа и снизу)

var data = new[] { 
    new[] {1, 1, 1, 1}, 
    new[] {1, 1, 1, 1}, 
    new[] {2, 3, 4, 5}, 
    new[] {6, 7, 8, 9}};

int n=4, m=4;
int k=0;

for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
    if (i < n-1 && data[i][j] == data[i+1][j]) k++;
    if (j < m-1 && data[i][j] == data[i][j+1]) k++;
}

Console.WriteLine(k);

Вывод

10
→ Ссылка
Автор решения: Тарас Атавин

Не путай c/c++ с паскалем, здесь массив может быть только линейным.

→ Ссылка