北航计算机机试08旋转矩阵
旋转矩阵
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。(60分)
我一直觉得这句话有含义……
思路:旋转一次则是
旋转90°:a[i][j]=a[j][n-1-i];
旋转180°: a[i][j]=a[n-i-1][n-j-1];
旋转270°: a[i][j]=a[n-j-1][i];
–!!!!!!!输入一定要确保能循环输入!!!!!!!!!!!!!!
#include <stdio.h>
#define MAX_SIZE 9
int rever(int a[][MAX_SIZE],int n,int b[][MAX_SIZE],int tri);
int compare(int a[][MAX_SIZE],int n,int b[][MAX_SIZE]);
int main()
{
int n;//阶
int i,j;
int angle;
while(scanf("%d",&n)!=EOF)
{
int a[MAX_SIZE][MAX_SIZE],b[MAX_SIZE][MAX_SIZE];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&b[i][j]);
}
}
if(compare(a,n,b)==1) angle=0;
else{
angle=rever(a,n,b,90);
}
printf("%d\n",angle);
}
return 0;
}
int rever(int a[][MAX_SIZE],int n,int b[][MAX_SIZE],int tri)
{
int flag=0;
int c[MAX_SIZE][MAX_SIZE];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
c[j][n-i-1]=a[i][j];
}
}
if(compare(c,n,b)==0&&tri<270)
{
tri+=90;
flag=rever(c,n,b,tri);
return flag;
}
else if(tri==270)
{
return -1;
}
else{
return tri;
}
}
int compare(int a[][MAX_SIZE],int n,int b[][MAX_SIZE])
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]!=b[i][j])
return 0;
}
}
return 1;
}
#include <stdio.h>
#define MAX_SIZE 9
int main()
{
int n;//阶
int i,j;
int flag=0;
int f[4]={0,0,0,0};
int a[MAX_SIZE][MAX_SIZE],b[MAX_SIZE][MAX_SIZE];
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&b[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]==b[i][j])
f[0]++;
if(a[i][j]==b[j][n-i-1])
f[1]++;
if(a[i][j]==b[n-i-1][n-j-1])
f[2]++;
if(a[i][j]==b[n-j-1][i])
f[3]++;
}
}
for(i=0;i<4;i++)
{
if(f[i]==n*n)
{
printf("%d\n",i*90);
flag++;
break;
}
}
if(flag==0)
printf("-1\n");
return 0;
}