Решение 1 - Указатели обмена
В зависимости от представления данных (и при условии, что каждый символ представляет собой «пиксель» _), это может потенциально быть достигнуто простым обменом указателями. Например, если оно определено как:
char *matrix[N];
Там, где каждая «строка» (или «столбец» в зависимости от определения) затем выделяется динамически, вы можете поменять местами указатели. Сделайте это (но в цикле ... Я просто показываю идею одного обмена):
char* tmp = matrix[0];
matrix[0] = matrix[N-1];
matrix[N-1] = tmp;
В зависимости от макета представление может представлять собой строки или столбцы.
Решение 2 - Ничего не перемещайте / меняйте местами
В зависимости от того, как данные отображаются, самым быстрым способом может быть вовсе не переворачивание данных. Просто отобразите это в другом порядке. Например, вместо этого:
for ( r = 0; r < N; r++ )
for ( c = 0; c < N; c++ )
displayMe( r, c, matrix[r][c] );
Сделайте это (или что-то подобное):
for ( r = 0; r < N; r++ )
for ( c = 0; c < N; c++ )
displayMe( r, c, matrix[N - r - 1][c] );