假设数组(也可以看做矩阵) 有如下的图形坐标变换

docxtemplater数组套数组 图片在同一个行_i++

 


 接下来看看七种图形变化对应的矩阵变化应该是怎样的。

 

首先看看怎么判断相同吧,毕竟我们用变换后的和给定变换后的作比较,如果相同那就是该方法变化得到

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(列)的关系,如下:

docxtemplater数组套数组 图片在同一个行_数组_02

 再进行找规律,经推敲可得

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(列)的关系,如下:

docxtemplater数组套数组 图片在同一个行_i++_03

 

分析可得

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

列表:

docxtemplater数组套数组 图片在同一个行_数组_04

这次规律有一些难找了,是

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

又是无聊的列表:

 

docxtemplater数组套数组 图片在同一个行_i++_05

 

可以找出

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;