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