Учебник. К.Ю Поляков, Е.А. Ерёмин. Информатика. 10 класс. Углублённый уровень. §67 Матрицы
Задача V. Вращение вправо
PASCAL
program p67V;
var mtr:array of array of longint;
n:byte; //количество строк и столбцов
i,j:byte;
tmp:longint;
fin:text;
begin
assign(fin,'input.txt');
reset(fin);
readln(fin,n);
//динамическое выделение памяти под матрицу
SetLength(mtr,n);
for i:=0 to n-1 do SetLength(mtr[i],n);
//чтение матрицы из файла
for i:=0 to n-1 do
for j:=0 to n-1 do read(fin,mtr[i,j]);
{ вращаем по часовой стрелке верхнюю строку, правый столбец, нижнюю строку, левый столбец
tmp:=mtr[0,0]; mtr[0,0]:=mtr[n-1,0]; mtr[n-1,0]:=mtr[n-1,n-1]; mtr[n-1,n-1]:=mtr[0,n-1]; mtr[0,n-1]:=tmp;
tmp:=mtr[0,1]; mtr[0,1]:=mtr[n-2,0]; mtr[n-2,0]:=mtr[n-1,n-2]; mtr[n-1,n-2]:=mtr[1,n-1]; mtr[1,n-1]:=tmp;
tmp:=mtr[0,2]; mtr[0,2]:=mtr[n-3,0]; mtr[n-3,0]:=mtr[n-1,n-3]; mtr[n-1,n-3]:=mtr[2,n-1]; mtr[2,n-1]:=tmp;
.........................................................................................................
tmp:=mtr[0,n-2]; mtr[0,n-2]:=mtr[1,0]; mtr[1,0]:=mtr[n-1,1]; mtr[n-1,1]:=mtr[n-2,n-1]; mtr[n-2,n-1]:=tmp;
или одним циклом
for j:=0 to n-2 do
begin
tmp:=mtr[0,j]; mtr[0,j]:=mtr[n-1-j,0]; mtr[n-1-j,0]:=mtr[n-1,n-1-j]; mtr[n-1,n-1-j]:=mtr[j,n-1]; mtr[j,n-1]:=tmp;
end;
вращаем следующий "слой" по кругу
tmp:=mtr[1,1]; mtr[1,1]:=mtr[n-2,1]; mtr[n-2,1]:=mtr[n-2,n-2]; mtr[n-2,n-2]:=mtr[1,n-2]; mtr[1,n-2]:=tmp;
tmp:=mtr[1,2]; mtr[1,2]:=mtr[n-3,1]; mtr[n-3,1]:=mtr[n-2,n-3]; mtr[n-2,n-3]:=mtr[2,n-2]; mtr[2,n-2]:=tmp;
tmp:=mtr[1,3]; mtr[1,3]:=mtr[n-4,1]; mtr[n-4,1]:=mtr[n-2,n-4]; mtr[n-2,n-4]:=mtr[3,n-2]; mtr[3,n-2]:=tmp;
.........................................................................................................
tmp:=mtr[1,n-3]; mtr[1,n-3]:=mtr[2,1]; mtr[2,1]:=mtr[n-2,2]; mtr[n-2,2]:=mtr[n-3,n-2]; mtr[n-3,n-2]:=tmp;
или одним циклом
for j:=1 to n-3 do
begin
tmp:=mtr[1,j]; mtr[1,j]:=mtr[n-1-j,1]; mtr[n-1-j,1]:=mtr[n-2,n-1-j]; mtr[n-2,n-1-j]:=mtr[j,n-2]; mtr[j,n-2]:=tmp;
end;
}
//можно заметить закономерность и свести всё к двойному циклу
for i:=0 to (n-1) div 2 do
for j:=i to n-2-i do
begin
tmp:=mtr[i,j]; mtr[i,j]:=mtr[n-1-j,i]; mtr[n-1-j,i]:=mtr[n-1-i,n-1-j]; mtr[n-1-i,n-1-j]:=mtr[j,n-1-i]; mtr[j,n-1-i]:=tmp;
end;
//вывод изменённой матрицы матрицы
for i:=0 to n-1 do
begin
for j:=0 to n-1 do write(mtr[i,j],' ');
writeln;
end;
close(fin);
end.
C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
int **mtr;
int n;
int i,j;
int tmp;
ifstream fin;
fin.open("input.txt");
fin >> n;
//динамическое выделение памяти под матрицу
mtr = new int* [n];
for (i=0; i<n; i++) mtr[i] = new int[n];
//чтение матрицы из файла
for (i=0; i<n; i++)
for (j=0; j<n; j++) fin >>mtr[i][j];
//вращаем по часовой стрелке верхнюю строку, правый столбец, нижнюю строку, левый столбец
/*
tmp=mtr[0][0]; mtr[0][0]=mtr[n-1][0]; mtr[n-1][0]=mtr[n-1][n-1]; mtr[n-1][n-1]=mtr[0][n-1]; mtr[0][n-1]=tmp;
tmp=mtr[0][1]; mtr[0][1]=mtr[n-2][0]; mtr[n-2][0]=mtr[n-1][n-2]; mtr[n-1][n-2]=mtr[1][n-1]; mtr[1][n-1]=tmp;
tmp=mtr[0][2]; mtr[0][2]=mtr[n-3][0]; mtr[n-3][0]=mtr[n-1][n-3]; mtr[n-1][n-3]=mtr[2][n-1]; mtr[2][n-1]=tmp;
.........................................................................................................
tmp=mtr[0][n-2]; mtr[0][n-2]=mtr[1][0]; mtr[1][0]=mtr[n-1][1]; mtr[n-1][1]=mtr[n-2][n-1]; mtr[n-2][n-1]=tmp;
или одним циклом
for (j=0; i<n-1; i++)
{
tmp=mtr[0][j]; mtr[0][j]=mtr[n-1-j][0]; mtr[n-1-j][0]=mtr[n-1][n-1-j]; mtr[n-1][n-1-j]=mtr[j][n-1]; mtr[j][n-1]=tmp;
}
вращаем следующий "слой" по кругу
tmp=mtr[1][1]; mtr[1][1]=mtr[n-2][1]; mtr[n-2][1]=mtr[n-2][n-2]; mtr[n-2][n-2]=mtr[1][n-2]; mtr[1][n-2]=tmp;
tmp=mtr[1][2]; mtr[1][2]=mtr[n-3][1]; mtr[n-3][1]=mtr[n-2][n-3]; mtr[n-2][n-3]=mtr[2][n-2]; mtr[2][n-2]=tmp;
tmp=mtr[1][3]; mtr[1][3]=mtr[n-4][1]; mtr[n-4][1]=mtr[n-2][n-4]; mtr[n-2][n-4]=mtr[3][n-2]; mtr[3][n-2]=tmp;
.........................................................................................................
tmp=mtr[1,n-3]; mtr[1,n-3]=mtr[2,1]; mtr[2,1]=mtr[n-2,2]; mtr[n-2,2]=mtr[n-3,n-2]; mtr[n-3,n-2]=tmp;
или одним циклом
for (j=0; i<n-2; i++)
{
tmp=mtr[1][j]; mtr[1][j]=mtr[n-1-j][1]; mtr[n-1-j][1]=mtr[n-2][n-1-j]; mtr[n-2][n-1-j]=mtr[j][n-2]; mtr[j][n-2]=tmp;
}
*/
//можно заметить закономерность и свести всё к двойному циклу
for (i=0; i<=(n-1)/2; i++)
for (j=i; j<=n-2-i; j++)
{
tmp=mtr[i][j]; mtr[i][j]=mtr[n-1-j][i]; mtr[n-1-j][i]=mtr[n-1-i][n-1-j]; mtr[n-1-i][n-1-j]=mtr[j][n-1-i]; mtr[j][n-1-i]=tmp;
}
//вывод изменённой матрицы матрицы
for (i=0; i<n; i++)
{
for (j=0; j<n; j++) cout << mtr[i][j] << " ";
cout << endl;
}
fin.close();
return 0;
}