Создание функции для проверки наличия смежных одинаковых элементов в 2D-массиве в C

Мне нужно создать код, который берет 2D-массив, а затем отправляет его в другую функцию, которая проверяет, есть ли смежные одинаковые элементы по строке или по столбцу, или по диагностической строке, и подсчитывает их, область поиска каждого элемента сужается до 1, поэтому каждый элемент проверяет 8 элементов, возводящих его в квадрат, и ничего сверх этого, у кого-нибудь есть идея, как это сделать? я пытался добавить некоторые условия, но ничего не работало, и счетчик оставался на 0 p.s. я оставил if () пустым, потому что перепробовал множество условий, и ни одно из них не сработало. это то, что я придумал до сих пор:

  #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define rows 2
#define columns 3
int MatrixCheck(int Matrix[rows][columns])
{
    int i = 0, j = 0;
    int Counter = 0;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < columns; j++)
        {
            if ()
            {
                Counter++;
            }
        }

    }
    return Counter;
}
int Matrix()
{
    int Matrix[rows][columns];
    int i, j, Count = 0, Sum = 0;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < columns; j++)
        {
            printf("Enter Value For Place : [%d][%d]   ", i, j);
            scanf("%d", &Matrix[i][j]);
        }
    }
    printf("Matrix Display:  \n");
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < columns; j++)
        {
            Count++;
            printf("%d   ", Matrix[i][j]);
            if (Count % columns == 0)
            {
                printf("\n");
            }
        }
    }
}

int main()
{
    Matrix();
    MatrixCheck(Matrix);
    printf("Neighbores Count is %d .\n", MatrixCheck(Matrix));
    return 0;
}
    ```

Вы можете проверить 8 соседей, КРОМЕ где row == 0 или col == 0 или col == cols - 1 или row == rows - 1. В этих особых случаях вы можете проверять только соседей, которые находятся внутри массива (а не за его пределами). Для диагонали применяется тот же предел, но вы проверяете только когда i == j.

David C. Rankin 14.12.2020 10:21

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

SelfishCrawler 14.12.2020 10:23

Вы оборачиваете, обрезаете, расширяете, обнуляете и т. д. свои края?

Neil 15.12.2020 06:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы все еще застряли, как упоминалось в комментарии выше, вам нужно перебрать каждую строку и столбец и проверить доступные соседи на равенство. Сложность заключается в том, чтобы ограничить поиск всех 8-соседей, когда текущий индекс находится на краю или в углу. Например, ваши 2D-массивы имеют размеры ROWS x COLS, и вы выполняете цикл:

    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {

Вы находитесь на верхнем и нижнем краю в точках i == 0 и i == ROWS-1, а также на левом и правом краях в точках j == 0 и j == COLS-1. Вы находитесь в верхних углах [0][0], [0][COLS-1] и нижних углах [ROWS-1][0], [ROWS-1][COLS-1].

Есть два способа ограничить проверки окружающих соседей, чтобы убедиться, что вы не проверяете элементы за пределами вашего массива. Вы можете просто перебрать i и j выше и создать довольно длинный набор операторов if ... else if ... else if ... else, охватывающих случаи на каждом краю и углу. По сути, избегая использования дополнительных вложенных циклов, разворачивая логику, которую вам нужно будет зафиксировать при установке ограничений вложенных циклов. Этот подход, вероятно, дает преимущества в производительности, но длина необходимого кода может быть в 4–8 раз больше, чем при использовании вложенного цикла.

С вложенными циклами вам нужно будет выполнить цикл:

    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            /* loop from i-1 to i+1 */
                /* loop from j-1 to j+1 */

Это дает гораздо более короткий код, но требует некоторой осторожности при установке ограничений для каждого из последних двух циклов. Если вы не знакомы с тройкой, то это, по сути, сокращение if ... else ..., которое можно использовать в строке. Основной формат (condition) ? if_true : if_false. Таким образом, с помощью внутренних циклов выше вы можете ограничить диапазон для каждого из циклов от i до i+1, если i == 0, и от i-1 до i, если i == ROWS-1 (и аналогично для внутреннего цикла по столбцам)

Вам также необходимо дополнительное условие, чтобы избежать проверки того, равен ли текущий индекс самому себе, чтобы создать допустимое количество соседей. Таким образом, с исходными элементами в arr, а затем числом соседей для каждого индекса, захваченного в sum, вы можете сделать что-то похожее на следующее:

    for (int i = 0; i < ROWS; i++) {        /* loop over each row */
        for (int j = 0; j < COLS; j++) {    /* loop over each col */
            /* loop k from i-1 to i+1, use ternary to omit out of bounds checks */
            for (int k = i ? i-1 : i; k <= ((i < ROWS - 1) ? i + 1 : i); k++) {
                /* loop l from j-1 to j+1, user ternary to omit out of bounds checks */
                for (int l = j ? j-1 : j; l <= ((j < COLS - 1) ? j + 1 : j); l++) {
                    /* if not comparing element to itself */
                    if (arr[i][j] == arr[k][l] && !(k == i && j == l))
                        sum[i][j] += 1;     /* increment sum[i][j] */
                }
            }
        }
    }

(примечание: тройка используется как для инициализации счетчика циклов, так и для установки предела цикла для каждого из циклов)

Полный пример, который генерирует массив 10x10 со случайными значениями 1-10, выводит массив, а затем проверяет соседей с помощью приведенной выше логики, а затем выводит результаты в формате Minesweeper из-за отсутствия лучших слов, где каждая ячейка содержит количество эквивалентных соседей. вокруг него, выводя пустую продажу, если нет равных соседей, например.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROWS 10         /* if you need a constant, #define one (or more) */
#define COLS ROWS       /* 10 x 10 */

int main (void) {
    
    int arr[ROWS][COLS] = {{0}},        /* array holding random values 1-10 */
        sum[ROWS][COLS] = {{0}};        /* array holding no. surrounding elements equal */
    
    srand (time(NULL));                 /* seed random number generator */
    
    for (int i = 0; i < ROWS; i++) {                /* loop filling array/output */
        for (int j = 0; j < COLS; j++) {
            arr[i][j] = rand() % 10 + 1;
            printf (j ? " %3d" : "%3d", arr[i][j]);
        }
        putchar ('\n');
    }
    putchar ('\n');
    
    for (int i = 0; i < ROWS; i++) {        /* loop over each row */
        for (int j = 0; j < COLS; j++) {    /* loop over each col */
            /* loop k from i-1 to i+1, use ternary to omit out of bounds checks */
            for (int k = i ? i-1 : i; k <= ((i < ROWS - 1) ? i + 1 : i); k++) {
                /* loop l from j-1 to j+1, user ternary to omit out of bounds checks */
                for (int l = j ? j-1 : j; l <= ((j < COLS - 1) ? j + 1 : j); l++) {
                    /* if not comparing element to itself */
                    if (arr[i][j] == arr[k][l] && !(k == i && j == l))
                        sum[i][j] += 1;     /* increment sum[i][j] */
                }
            }
        }
    }
    
    puts ("\nNumber Surrounding Cells Equal (minesweeper format):\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++)
            if (sum[i][j])
                printf ("  %d ", sum[i][j]);    /* if >= 1 output */
            else
                fputs ("    ", stdout);         /* otherwise output blank cell */
        putchar ('\n');
    }

Пример использования/вывода

$ ./bin/arr_edges_adj_equal
  6   9   7  10   3  10  10   8   9   6
  9   9   4   1   4  10   5   9   6  10
  5   5   7   6   2   8   1   6   3  10
  2  10   8  10   1   1   9  10  10  10
  6  10  10   1  10   6   2   4   4   8
  3   9   2   2   6   5   9   6   2   3
  5   6   4   3   5   4   3   6   3   2
  7  10   1   6   3   3   1   4   6   7
  1   1   5   5   2  10   1   2   7   5
  6   2  10   9   4   4   4   8   1   6


Number Surrounding Cells Equal (minesweeper format):

      2               2   2       1   1
  2   2               2       1   2   1
  1   1                   1   1       3
      2       2   2   2       1   3   2
      2   3   1   1   1       1   1
          1   1   1   1       1   1   1
              1   1       1   2   1   1
          1       2   2   1       1   1
  1   2   1   1           1       1
                  1   2   1

Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.

Другие вопросы по теме