Например, предполагая, что есть ширина и высота, 6 и 4 соответственно поступили из пользовательского ввода, а входы (также из пользовательских входов), которые хранятся в 2D-массиве, следующие:
0 1 2 2 1 0
1 0 0 0 0 1
1 0 0 0 0 1
0 1 1 1 1 0
Есть ли способ перевернуть ось x и ось y? Я пытаюсь изменить
0 1 2 2 1 0
1 0 0 0 0 1
1 0 0 0 0 1
0 1 1 1 1 0
в
0 1 1 0
1 0 0 1
2 0 0 1
2 0 0 1
1 0 0 1
0 1 1 0
Код ниже,
scanf("%d %d", &width, &height);
int board[height][width];
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
scanf("%d", &input);
board[i][j] = input;
}
}
и делая
for(i = 0; i < width; i++)
{
for(j = 0; j < height; j++)
{
printf("%d", board[j][i]);
}
printf("\n");
}
, это распечатывает результаты, которые я ожидал, но на самом деле не меняет своих позиций ... Я не могу изменить первую часть кодирования, так как я уже использовал ее для других работ. Есть ли способ решить проблему, добавив другие методы или новую плату?
Кто-нибудь может мне помочь? Буду очень благодарен, если мне кто-нибудь поможет! Спасибо





Просто объявите второй массив с указанным количеством строк, равным width, и количеством столбцов, равным height, и скопируйте значения из массива souirce во второй массив.
Например
#include <stdio.h>
int main(void)
{
size_t height, width;
printf( "Enter the height and the width of the array: " );
scanf( "%zu %zu", &height, &width );
int a[height][width];
puts( "Enter values for elements of the array" );
for ( size_t i = 0; i < height; i++ )
{
printf( "%zu row: ", i + 1 );
for ( size_t j = 0; j < width; j++ ) scanf( "%d", &a[i][j] );
}
int b[width][height];
for ( size_t i = 0; i < height; i++ )
{
for ( size_t j = 0; j < width; j++ ) b[j][i] = a[i][j];
}
puts( "\nSource array is" );
for ( size_t i = 0; i < height; i++ )
{
for ( size_t j = 0; j < width; j++ ) printf( "%d ", a[i][j] );
putchar( '\n' );
}
puts( "\nReversed array is" );
for ( size_t i = 0; i < width; i++ )
{
for ( size_t j = 0; j < height; j++ ) printf( "%d ", b[i][j] );
putchar( '\n' );
}
return 0;
}
Вывод программы может выглядеть так:
Enter the height and the width of the array: 4 6
Enter values for elements of the array
1 row: 0 1 2 2 1 0
2 row: 1 0 0 0 0 1
3 row: 1 0 0 0 0 1
4 row: 0 1 1 1 1 0
Source array is
0 1 2 2 1 0
1 0 0 0 0 1
1 0 0 0 0 1
0 1 1 1 1 0
Reversed array is
0 1 1 0
1 0 0 1
2 0 0 1
2 0 0 1
1 0 0 1
0 1 1 0
Другой подход - динамическое размещение первого и вспомогательных массивов. Например
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
size_t height, width;
printf( "Enter the height and the width of the array: " );
scanf( "%zu %zu", &height, &width );
int **a = malloc( height * sizeof( int * ) );
for ( size_t i = 0; i < height; i++ ) a[i] = malloc( width * sizeof( int ) );
puts( "Enter values for elements of the array" );
for ( size_t i = 0; i < height; i++ )
{
printf( "%zu row: ", i + 1 );
for ( size_t j = 0; j < width; j++ ) scanf( "%d", &a[i][j] );
}
int **b = malloc( width * sizeof( int * ) );
for ( size_t i = 0; i < width; i++ ) b[i] = malloc( height * sizeof( int ) );
for ( size_t i = 0; i < height; i++ )
{
for ( size_t j = 0; j < width; j++ ) b[j][i] = a[i][j];
}
puts( "\nSource array is" );
for ( size_t i = 0; i < height; i++ )
{
for ( size_t j = 0; j < width; j++ ) printf( "%d ", a[i][j] );
putchar( '\n' );
}
for ( size_t i = 0; i < height; i++ ) free( a[i] );
free( a );
a = b;
puts( "\nReversed array is" );
for ( size_t i = 0; i < width; i++ )
{
for ( size_t j = 0; j < height; j++ ) printf( "%d ", a[i][j] );
putchar( '\n' );
}
for ( size_t i = 0; i < width; i++ ) free( a[i] );
free( a );
return 0;
}
Это, наверное, самый простой подход. Избегайте копирования и сохраняйте элементы во время ввода. Но если вы не можете изменить процедуру ввода, вам нужно скопировать элементы, используя:
void reverse_matrix(int c, int r, int board[][r], int board2[][c])
Код:
#include <stdio.h>
void print(int c, int r, int board[][r] )
{
for(int i = 0; i < c; i++)
{
for(int j = 0; j < r; j++)
{
printf("%d ", board[i][j]);
}
printf("\n");
}
}
void reverse_matrix(int c, int r, int board[][r], int board2[][c] )
{
for(int i = 0; i < c; i++)
{
for(int j = 0; j < r; j++)
{
board2[j][i] = board[i][j];
}
}
}
int main()
{
int width, height, input;
scanf("%d %d", &width, &height);
int board[height][width];
int board2[width][height];
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
scanf("%d", &input);
board[i][j] = input;
// board2[j][i] = input; // if you can add it
}
}
printf("First matrix:\n");
print(height, width, board);
reverse_matrix(height, width, board, board2); // alternative
printf("Second matrix:\n");
print(width, height, board2);
return 0;
}
Выход:
2
3
1
2
3
4
5
6
First matrix:
1 2
3 4
5 6
Second matrix:
1 3 5
2 4 6
Вы должны объявить второй массив и скопировать значения из первого массива во второй массив.