假设数组(也可以看做矩阵) 有如下的图形坐标变换
接下来看看七种图形变化对应的矩阵变化应该是怎样的。
首先看看怎么判断相同吧,毕竟我们用变换后的和给定变换后的作比较,如果相同那就是该方法变化得到
a数组表示第一个输入的矩阵,b数组表示变换后的矩阵,c数组表示要对照的矩阵,d数组为将要存放的矩阵,所以可以写出以下判断b矩阵与c矩阵相同的代码
↓↓↓
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
简单明了,蒟蒻都能懂!
First:n=1
设原矩阵为↓↓↓
11 12 13
21 22 23
31 32 33
那么,经过顺时针转90度的矩阵为
31 21 11
32 22 12
33 23 13
列出i(行)与j(列)的关系,如下:
再进行找规律,经推敲可得
b[j][n-i+1]=a[i][j]
再与前面所说的判断合在一起,可得:
bool work1()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
b[j][n-i+1]=a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
∴当n=1时,代码打好了。
Second:n=2
相同的,设原矩阵为↓↓↓
11 12 13
21 22 23
31 32 33
那么,经过顺时针转180度的矩阵为
33 32 31
23 22 21
13 12 11
列出i(行)与j(列)的关系,如下:
分析可得
b[n-i+1][n-j+1]=a[i][j]
代码实现:
bool work2()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
b[n-i+1][n-j+1]=a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
当然,当n=2,也可以看做进行了两次1操作,即:
void work2()
{
work1(); //第一次操作
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=b[i][j]; //重置矩阵
work1(); //第二次操作
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
两代码的结果相同,但前者效率较高,后者代码短小精悍,更好理解。
∴∴当n=2时,代码打好了。
Third:n=3
同样的,设原矩阵为↓↓↓
11 12 13
21 22 23
31 32 33
那么,经过顺时针转270度的矩阵为
13 23 33
12 22 32
11 21 31
列表:
这次规律有一些难找了,是
b[n-j+1][i]=a[i][j]
于是
bool work3()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
b[n-j+1][i]=a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
也可以看作先进行一次1操作再进行一次2操作 代码:
bool work3()
{
work1(); //第一次操作
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=b[i][j]; //重置矩阵
work2(); //第二次操作
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
n=3完工!
Fourth:n=4
同样的,设原矩阵为↓↓↓
11 12 13
21 22 23
31 32 33
那么,经过反射的矩阵为
13 12 11
23 22 21
33 32 31
又是无聊的列表:
可以找出
b[i][n-j+1]=a[i][j]
代码实现:
bool work4()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
b[i][n-j+1]=a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
OK
Fifth:n=5
5操作就是将4,1,2,3操作混和(粗略的说法),作者为了偷懒,QAQ,就不找规律了,给出代码:
bool work5()
{
work4();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=d[i][j]; //重置矩阵
if(work1())
return 1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=d[i][j]; //重置矩阵
if(work2())
return 1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=d[i][j]; //重置矩阵
if(work3())
return 1;
return 0;
}
逃
Sixth:n=6
没有操作,直接比较:
bool work6()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
easy
Seventh:n=7
毕竟只有7种情况,前6种都不是,到这里直接输出7即可
cout<<7;