Ошибка при обходе матрицы спиралью
Написал код обхода матрицы спиралью, она все делает правильно, кроме заключительного шага, в чем ошибка, никак не могу найти?
int* helix(int **matrix, int size) {
int* new_matrix = new int[size * size];
int count = 0;
int sup_var = size / 2; // кол во проходов спиралью
for (int i = 0; i < sup_var; i++) {
for (int j = i; j < size - i; j++) {
new_matrix[count] = matrix[i][j]; // строка вправо
count++;
}
for (int k = 1; k < size - i; k++) { // столбец вниз
new_matrix[count] = matrix[k][size - i - 1];
//cout << endl << new_matrix[count] << endl;
count++;
}
for( int j = size - i - 1; j > i; j--) { // строка влево
new_matrix[count] = matrix[size - i - 1][j - 1];
count++;
}
for (int k = size - i - 1; k > 1; k--) {
new_matrix[count] = matrix[k-1][i];
count++;
}
}
cout << endl << new_matrix[15];
return new_matrix;
}
Она проходит все верно, кроме последнего шага, выводит последние 2 элемента как 1 5, а должен 5 1
Ответы (1 шт):
Автор решения: entithat
→ Ссылка
У Вашем коде, 1 выводиться еще раз на первой итерации цикла, который проходится вниз.
Строка вниз (i = 1, вторая итерация главного цикла)
for (int k = 1; k < size - i; k++) {:
- 1 итерация:
k = 1, 1 < 4 - 1, m[1][4 - 1 - 1] = 1 - 2 итерация:
k = 2, 2 < 4 - 1, m[2][4 - 1 - 1] = 5
Видим, что сначала выводиться 1, а потом 5. Соответственно надо начинать с елемента ниже.
P.S. Странно, что после 5 не вывелась еще 1. У Вас код не соответствует выводу.
Можете переделать так:
int* helix(int** matrix, int size)
{
int* new_matrix = new int[size * size];
for (int i = 0, c = 0, i <= size / 2; i++) {
for (int j = i; j < size - i; j++) new_matrix[c++] = matrix[i][j];
for (int j = i + 1; j < size - i - 1; j++) new_matrix[c++] = matrix[j][size - i - 1];
for (int j = size - i - 1; c <= size * size && j >= i; j--) new_matrix[c++] = matrix[size - i - 1][j];
for (int j = size - i - 2; j > i; j--) new_matrix[c++] = matrix[j][i];
}
return new_matrix;
}


