#include <iostream>
using namespace std;
void citire(int A[51][51], int &n)
{
cin>>n; //citesc numarul de linii
for(int i=1;i<=n;i++) //parcurg matricea
for(int j=1;j<=n;j++)
cin>>A[i][j]; //citesc elementele
}
void afisare(int A[51][51], int n)
{
for(int i=1;i<=n;i++) //parcurg matricea
{
for(int j=1;j<=n;j++)
cout<<A[i][j]<<" "; //afisez elementul
cout<<endl;//trec la linia urmatoare
}
}
int prim(int n)
{
if(n==0 || n==1) return 0;// 0 si 1 nu sunt prime
if(n%2==0 && n!=2) return 0;//numerele pare inafara de 2 nu sunt prime
for(int d=3;d*d<=n;d=d+2) //caut divizori impari pana la radical din n
if(n%d==0) return 0;// daca am gasit divizor atunci numarul nu este prim
return 1;//numarul este prim
}
int superprim(int n)
{
int c=1,p=1,x=n;
while(x>9)
{
c++; //calculez numarul de cifre
p=p*10; //si puterea asociata celei de a doua cifre din n
x=x/10;
}
for(int i=1;i<=c;i++) //de c ori
{
if(prim(n)) return 1; //am gasit numar prim
n=n%p*10+n/p; //duc la sfarsit prima cifra
}
return 0;//daca nu am gasit nici un numar prim
}
void inter(int &x, int &y)// interschimba x cu y
{
int aux=x; x=y; y=aux;
}
void intersj(int A[51][51], int n)
{//inserschimb triunghiul de sus cu cel de jos
for(int i=1;i<=n/2;i++) //parcurg triunghiul de sus
for(int j=i+1;j<n+1-i;j++)
inter(A[i][j],A[n+1-i][j]); //interchimb
}
void intersd(int A[51][51], int n)
{//inserschimb triunghiul din stanga cu cel din dreapta
for(int i=2;i<=n-1;i++)//parcurg triunghiul din stanga
for(int j=1;j<min(i,n+1-i);j++)
if(superprim(A[i][j]) && superprim(A[i][n+1-j])) //daca ambele elemente sunt superprime
inter(A[i][j],A[i][n+1-j]);//le interschimb
}
int main()
{
int A[51][51],n;
citire(A,n);
intersj(A,n);
intersd(A,n);
afisare(A,n);
return 0;
}
|