fork download
  1. #include <stdio.h>
  2. #define N 3
  3. #define M 5
  4.  
  5. void swap(int * a, int * b)
  6. {
  7. const int temp = *b;
  8. *b = *a;
  9. *a = temp;
  10. }
  11. void printarray(int * B)
  12. {
  13. for(int i = 0; i < N; ++i)
  14. {
  15. for(int j = 0; j < M; ++j, ++B)
  16. printf("%d\t", *B);
  17. printf("\n");
  18. }
  19. }
  20. int main(void) {
  21. int B[N][M];
  22. int i, j;
  23. // заполняем массив начальными значениями и выводим на экран
  24. for(i = 0; i < N; ++i)
  25. for(j = 0; j < M; ++j)
  26. B[i][j] = i * M + j + 1;
  27. printf("Начальный массив:\n");
  28. printarray(& B[0][0]);
  29.  
  30. int beginrow, begincol, endrow, endcol;
  31. int i1;
  32. beginrow = 0;
  33. begincol = 0;
  34. endrow = N;
  35. endcol = M;
  36. for(i = 0; i < N / 2; ++i)
  37. {
  38. // для промежуточного хранения при обмене используется первый элемент подматрицы
  39. // двигаем первую строку
  40. i1 = beginrow;
  41. for(j = begincol + 1; j < endcol; ++j)
  42. swap(& B[beginrow][begincol], & B[i1][j]);
  43. // двигаем последний столбец без первой и последней строк
  44. j = endcol - 1;
  45. for(i1 = beginrow + 1; i1 < (endrow - 1); ++i1)
  46. swap(& B[beginrow][begincol], & B[i1][j]);
  47. // двигаем последнюю строку в обратном порядке
  48. i1 = endrow - 1;
  49. for(j = endcol - 1; j >= begincol ; --j)
  50. swap(& B[beginrow][begincol], & B[i1][j]);
  51. // двигаем первый столбей в обратном порядке, кроме первой и последней строки
  52. j = begincol;
  53. for(i1 = endrow - 2; i1 > beginrow; --i1)
  54. swap(& B[beginrow][begincol], & B[i1][j]);
  55.  
  56. ++beginrow;
  57. ++begincol;
  58. --endrow;
  59. --endcol;
  60. }
  61. if(N % 2)
  62. {
  63. // Для нечетных N нужно дополнительно двинуть средний вектор
  64. i1 = beginrow;
  65. for(j = begincol + 1; j < endcol; ++j)
  66. swap(& B[beginrow][begincol], & B[i1][j]);
  67. }
  68.  
  69. printf("Результат\n");
  70. printarray(& B[0][0]);
  71. return 0;
  72. }
  73.  
Success #stdin #stdout 0s 4496KB
stdin
Standard input is empty
stdout
Начальный массив:
1	2	3	4	5	
6	7	8	9	10	
11	12	13	14	15	
Результат
6	1	2	3	4	
11	9	7	8	5	
12	13	14	15	10