Переставить элемент в 2d-массиве

Я пытаюсь сдвинуть нули матрицы, чтобы получить миноры, используя в своей программе 2d-массив. Как правильно удалить (сдвинуть) элементы 2d-массива?

Я знаю, как решить эту проблему с 1d-массивом, переставив его элемент

for (int i = DEL; i < (SIZE - 1); i++)
    array[i] = array[i + 1];

Где DEL - индекс элемента, который мы хотим удалить, SIZE - размер массива. Но у меня не тот результат с многомерным массивом:

for (int i = DEL; i < (SIZE - 1); i++)
    for (int j = DEL; j < (SIZE - 1); j++)
        array[i][j] = array[i+1][j+1];

Где ошибка?

#include <iostream>

using namespace std;

int main()
{
    int array[3][3] = {
        1, 2, 3,
        4, 5, 6, 
        7, 8, 9};

    // Setting to zero 2nd row and 3rd column
    int m = 1; // 2
    int n = 2; // 3


    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            array[m][j] = 0;
            array[i][n] = 0;
            cout << array[i][j];
            // Trying to shift every element, which equals zero
            if (array[i][j] == 0)
                for (int k = i; k < 2; k++)
                    for (int l = j; l < 2; l++)
                        array[k][l] = array[k+1][l+1];          

        }
        cout << endl;
    }



    cout << endl;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            cout << array[i][j];
        cout << endl;
    }
}

Я получил:

120
000
780

120
000
780

Но на самом деле я хочу, чтобы последний вывод был таким:

120
780
000
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
0
285
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я думаю, что термин «перестановка» здесь не подходит. Вы хотите удалить строки и столбцы из двумерного массива.

Однако вы допустили некоторые смысловые ошибки. Я исправил это для вас и покажу вам исправленный код ниже.

Один большой совет. Попробуйте разбить большую проблему на несколько более мелких. Вы слишком много пытаетесь использовать многовложенные циклы for. Делайте одно за другим.

Пожалуйста, посмотри:

#include <iostream>

constexpr size_t MaxArraySize = 3;

int main()
{
    int array[MaxArraySize][MaxArraySize] = {
        1, 2, 3,
        4, 5, 6,
        7, 8, 9 };

    // Setting to zero 2nd row and 3rd column
    int rowToDelete = 1; // 2
    int colToDelete = 2; // 3

    // Set cell to delete to 0
    for (int row = 0; row < MaxArraySize; ++row)
    {
        for (int col = 0; col < MaxArraySize; ++col)
        {
            array[rowToDelete][col] = 0;
            array[row][colToDelete] = 0;
            std::cout << array[row][col];
        }
        std::cout << '\n';
    }

    // First shift all rows
    for (int row = rowToDelete; row < MaxArraySize - 1; ++row)
        for (int col = 0; col < MaxArraySize; ++col)
            array[row][col] = array[row+1][col];

    // Then shift all cols
    for (int col = colToDelete; col < MaxArraySize-1; ++col)
        for (int row = 0; row < MaxArraySize; ++row)
            array[row][col] = array[row][col+1];

    // Set the cells that were shifted away to 0
    for (int row = 0; row < MaxArraySize; ++row)
        array[row][MaxArraySize - 1] = 0;
    for (int col = 0; col < MaxArraySize; ++col)
        array[MaxArraySize - 1][col] = 0;

    // Show result
    std::cout << "\n\nResult\n\n";
    for (int row = 0; row < MaxArraySize; ++row)
    {
        for (int col = 0; col < MaxArraySize; ++col)
            std::cout << array[row][col];
        std::cout << '\n';
    }
}

2-й и даже более важный. Вы используете простой код C с простыми массивами C-Style. Единственный C++ в вашем коде использует iostreams. Это не так уж хорошо.

Попробуйте использовать С++. Никогда не используйте простой массив C-Style. Попробуйте использовать алгоритмы и контейнеры из STL. Используйте лучшие имена для переменных.

Полученный фрагмент кода будет очень простым. И здесь мы действительно удаляем строки и столбцы. Пожалуйста, посмотри:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
    // Lambda for printing the matric to std::cout
    auto print = [](std::vector<std::vector<int>> & m) {
        std::for_each(m.begin(), m.end(), [](std::vector<int> & vi) { std::copy(vi.begin(), vi.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; });
    };
    // You can add whatever values. 
    std::vector<std::vector<int>> matrix {
        {11, 12, 13, 14},
        {15, 16, 17, 18},
        {19, 20, 21, 22},
        {23, 24, 25, 26}
    };
    // Show initial data
    std::cout << "\n\nInitial matrix:\n";
    print(matrix);

    constexpr size_t RowToDelete = 1; // Row 2
    constexpr size_t ColToDelete = 2; // Column3

    // Erase row
    matrix.erase(matrix.begin() + RowToDelete);
    // Erase column in each row
    std::for_each(matrix.begin(),matrix.end(), [ColToDelete](std::vector<int> & vi) { vi.erase(vi.begin() + ColToDelete); });

    // Show result
    std::cout << "\n\nResulting matrix with deleted row " << RowToDelete+1 << " and deleted column " << ColToDelete+1 << '\n';
    print(matrix);

    return 0;
}

Надеюсь это поможет . . .

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