Переставить столбцы в прямоугольной матрице
В заданной прямоугольной матрице с количеством строк n и столбцов 2n переставить столбцы в следующем порядке: 1, n+1, 2, n+2, 3, n+3, … n, 2n. Например, в матрице с шестью столбцами итоговый порядок столбцов должен быть следующим: 1, 4, 2, 5, 3, 6. Количество строк в матрице должно задаваться с клавиатуры. Помогите написать алгоритм для перестановки столбцов. Вот фрагмент моей нерабочей задумки:
int k=1;
int m=2*n
for (i = 1; i <= n; i++){
for (j = 1; j <= m; j++){
if(j==k){
printf("%d",A[i][j]);k++;}
else
if(j==n+k){
printf(" %d",A[i][n+k]);k++;}
else
break;}}
Ответы (2 шт):
Автор решения: Вася Воронцов
→ Ссылка
Если решать последовательно, то можно прийти к такому решению:
#include <stdio.h>
int main() {
//Ввод числа
int n;
printf("Enter an integer: ");
scanf("%d", &n);
//Заполнение исходной матрицы
int m = 2*n;
int matrix[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
matrix[i][j] = i+j;
}
}
//Вывод исходной матрицы
printf("Matrix: \n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%d", matrix[i][j]);
printf(" ");
}
printf("\n");
}
//Транспонирование исходной матрицы для более простого обращения со столбцами
int transMatrix[m][n];
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
transMatrix[j][i] = matrix[i][j];
}
}
//Вывод транспонированной исходной матрицы
printf("\n");
printf("Transponirated matrix: \n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", transMatrix[i][j]);
printf(" ");
}
printf("\n");
}
//Фильтрация (упорядочивание) столбцов исходной матрицы
int transNewMatrix[m][n];
for (int j = 0; j < m; j += 2) {
for (int i = 0; i < n; i++) {
transNewMatrix[j][i] = transMatrix[j/2][i];
}
for (int i = 0; i < n; i++) {
transNewMatrix[j+1][i] = transMatrix[j/2+n][i];
}
}
//Вывод новой транспонированной матрицы
printf("\n");
printf("Transponirated new matrix: \n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", transNewMatrix[i][j]);
printf(" ");
}
printf("\n");
}
//Транспонирование новой матрицы
int newMatrix[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
newMatrix[i][j] = transNewMatrix[j][i];
}
}
//Вывод новой матрицы
printf("\n");
printf("New matrix: \n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%d", newMatrix[i][j]);
printf(" ");
}
printf("\n");
}
return 0;
}
Пропустив промежуточный вывод, получим:
Matrix:
0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
New matrix:
0 3 1 4 2 5
1 4 2 5 3 6
2 5 3 6 4 7
Автор решения: Павел Ериков
→ Ссылка
Приведу пример намного проще с созданием всего одной побочной матрицы и 1 циклом.
#include <stdio.h>
int main()
{
int n = 4;
int m = n << 1;
int t = 0;
int A[n][m];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
A[i][j] = ++t;
printf("%d ", A[i][j]);
}
printf("\n");
}
int B[n][n << 1];
int k = 0, l = n;
for(int i = 0; i < m; i++){
int* tmp = &k;
if(i % 2 == 1) tmp = &l;
for(int j = 0; j < n; j++)
B[j][i] = A[j][*tmp];
(*tmp)++;
}
printf("Новая матрица: \n");
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++)
printf("%d ", B[i][j]);
printf("\n");
}
return 0;
}