Я пытаюсь сдвинуть нули матрицы, чтобы получить миноры, используя в своей программе 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





Я думаю, что термин «перестановка» здесь не подходит. Вы хотите удалить строки и столбцы из двумерного массива.
Однако вы допустили некоторые смысловые ошибки. Я исправил это для вас и покажу вам исправленный код ниже.
Один большой совет. Попробуйте разбить большую проблему на несколько более мелких. Вы слишком много пытаетесь использовать многовложенные циклы 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;
}
Надеюсь это поможет . . .