Как получить последовательные числа в массиве, установленном на 0 C ++ - PullRequest
0 голосов
/ 06 августа 2020

Это то, что она должна делать: Эта функция должна принимать 2D-массив и проверять каждую строку и каждый столбец на наличие любого значения, которое повторяется / сопоставляется 3 раза подряд в строке или столбце. Он также должен распознавать, если их больше трех, и учитывать все это как одно совпадение. Все совпадающие значения должны быть установлены на ноль. Используйте тот же размер const. Вы не знаете, какими могут быть значения (в приведенном ниже примере это 1,2 и 3, но это может быть любое значение, кроме нуля). void checkMatches (int [ARRAY_SIZE] [ARRAY_SIZE] arr)

Это то, что у меня есть rn:

const int ARRAY_SIZE=8;
void checkMatches(int arr9[ARRAY_SIZE][ARRAY_SIZE]) {
    
    int count = 0;

    //check each row
    for (int row = 0; row < ARRAY_SIZE; row++) {
        int i = arr9[row][0];
        for (int col = 1; col < ARRAY_SIZE; col++) {
            if ( arr9[i] == arr9[i + 1]) {
                count++;
                if (count >= 3) {
                    i = 0;
                }
            }
            else {
                count = 0;
            }
        }
    }
    //check each column
    for (int col = 0; col < ARRAY_SIZE; col++) {
        int i = arr9[0][col];
        for (int row = 1; row < ARRAY_SIZE; row++) {
            if (arr9[i] == arr9[i + 1]) {
                count++;
                if (count > +3) {
                    i = 0;
                }
            }
            else {
                count = 0;
            }
        }
    }

}

int main(){
    int val;
    int arr9test[8][8];

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            cout << "Enter number to populate the array (include a few consecutive numbers): ";
            cin >> val;
            arr9test[j][i] = val;
        }
    }
    checkMatches(arr9test);
    cout << "Replacing consecutive numbers with 0's: " << arr9test << endl;

}

Любые подсказки были бы очень признательны!

Это вывод я получаю. (очень не массив) введите описание изображения здесь

1 Ответ

1 голос
/ 06 августа 2020

В вашем коде сейчас много ошибок.

void checkMatches(int arr9[ARRAY_SIZE][ARRAY_SIZE]) // 01
{
    int count = 0;

    //check each row
    for (int row = 0; row < ARRAY_SIZE; row++) {
        int i = arr9[row][0]; // 02
        for (int col = 1; col < ARRAY_SIZE; col++) {
            if ( arr9[i] == arr9[i + 1]) { // 03
                count++;
                if (count >= 3) {
                    i = 0; // 04, 05
                }
            }
            else {
                count = 0;
            }
        }
    }
    //check each column
    for (int col = 0; col < ARRAY_SIZE; col++) {
        int i = arr9[0][col]; // 02
        for (int row = 1; row < ARRAY_SIZE; row++) {
            if (arr9[i] == arr9[i + 1]) { // 03
                count++;
                if (count > +3) {
                    i = 0; // 04, 05
                }
            }
            else {
                count = 0;
            }
        }
    }
}

Я пометил проблемные c строки с помощью // xx, где xx - это номер проблемы, как показано ниже:

  1. Вы передаете массив без измерений. Попробуйте передать и размеры. Например:
void checkMatches(int[][] myArray, size_t xSz, size_t ySz)
Вы создаете бесполезную переменную стека. Удалите. Вы сравниваете «будущий» адрес. Это несовместимо с вашим l oop (начните с 1) и приведет к выходу за пределы допустимого диапазона. Это должно быть исправлено, чтобы использовать «прошлый» адрес:
if (arr9[row][col] == arr9[row][col - 1]) {
Вы пишете во временную переменную 'i', что не имеет смысла. Вам нужно записать в саму таблицу.
arr9[row][col] = 0;

Однако это проблема сама по себе, так как он будет записывать 0 только при третьем совпадении и будет эффективно сбрасывать счетчик, поскольку следующее сравнение будет сравниваться с только что записанным 0.

Вы записываете результаты перед выполнением второго прохода. Рассмотрим таблицу ниже:
1 2 3 4 5 6 7
2 3 4 4 4 4 6
3 2 1 4 1 2 3

Если я правильно вас понял, вам нужно следующее:

1 2 3 0 5 6 7
2 3 0 0 0 0 6
3 2 1 0 1 2 3

Это означает, что вы должны записывать адреса по мере чтения и выполнять обновления в конце.

Вот псевдокод, переписанный для вашего метода. Я использовал обозначение кортежа C# для краткости:

void checkMatches(int[][] arr9, size_t ySz, size_t xSz) // 01
{
    std::vector<(y, x)> lst; // a vector of some type of tuple structure.
    int count = 0;

    //check each row
    for (size_t row = 0; row < ySz; row++)
    {
        for (size_t col = 1; col < xSz; col++)
        {
            if ( arr9[row][col] != arr9[row][col - 1])
            {
                if (count > 3)
                {
                    size_t cl = col - 1;
                    while (count-- > 0)
                    {
                        lst.push_back(row, cl--);
                    }
                }
                else
                {
                     count = 0;
                }
             }
             else
             {
                 count++;
             }
        }

        if (count > 3)
        {
            size_t cl = xSz - 1;
            while (count-- > 0)
            {
                lst.push_back(row, cl--);
            }
        }
    }

    // check each column
    // TODO: apply the above code to check columns this time.  I won't copy/paste here, you can do that.  Keep adding to lst.

    // Update the table.
    for ((size_t, size_t) xy : lst)
    {
        arr9[xy.y][xy.x] = 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...