java - 矩阵“层”旋转
问题描述
考虑一个 m*n 阶矩阵。
它有 l 层。
我需要逆时针旋转每一层。
这是我想出的代码。
int a1=0; // a1,a2,a3,a4 are counters which start at beginning and the end of each row and column and are then moved to the next layers
int a2=m-1;
int a3=n-1;
int a4=0;
for(int j=0;j<l;j++) // l is the layers of the matrix
{
c=rotate(a,a1,a2,a3,a4);
a1++;
a2--;
a3--;
a4++;
}
这是旋转方法,它将传递的数组旋转1个单位
public static int[][] rotate(int a[][],int a1,int a2,int a3,int a4){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j==a1 && i<a2)
c[i+1][j]=a[i][j];
if(i==a2&& j<a3)
c[i][j+1]=a[i][j];
if(j==a3 && i>a4)
c[i-1][j]=a[i][j];
if(i==a4 && j>a1)
c[i][j-1]=a[i][j];}}
return c;}
注意 c 是一个全局变量,它是要打印的二维数组。
这适用于单次旋转。
但我需要旋转矩阵'r'次。
为此,我尝试了这个,
for(int i=0;i<r;i++)
{
int a1=0;
int a2=m-1;
int a3=n-1;
int a4=0;
for(int j=0;j<l;j++)
{
c=rotate(c,a1,a2,a3,a4); // c was initialized to a
a1++;
a2--;
a3--;
a4++;
}
}
但这给出了一个非常奇怪的输出,其中大部分空格都用整数 2 填充。
有没有更简单的方法呢?我正在考虑在 rotate() 中用 c[i+r][j] 替换 c[i+1][j],即在 rotate() 中用 r 替换 1,但即使这在某些地方给出了一个带有零的奇怪输出.
public static int[][] rotate(int a[][],int a1,int a2,int a3,int a4){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j==a1 && i+r<a2) //a1,a2
c[i+r][j]=a[i][j];
if(i==a2 && j+r<a3) //a2,a3
c[i][j+r]=a[i][j];
if(j==a3 && i-r>a4) //a3,a4
c[i-r][j]=a[i][j];
if(i==a4 && j-r>a1) //a4,a1
c[i][j-r]=a[i][j];}}
return c;}
我应该如何解决这个问题?
解决方案
这是我如何解决问题的高级概述。也许不是最有效的解决方案,所以让我知道您是否可以改进。
我们应该使用模来“旋转”矩阵,所以首先形成一个环数组,从最外面的环开始,到最里面的环结束。
这里我定义了环上的几个关键点:
top_right
、bottom_right
和bottom_left
,其中每个点对应于环上的一个索引。使用这些点来决定您从矩阵的哪个位置映射您的点。现在从环数组中重建矩阵,使用
rotations % ring_length
指针作为指针,就像你对常规数组旋转所做的那样。
推荐阅读
- android - Android APK 在设备上显示黑屏
- c# - C# WebClient 308 永久重定向
- asp.net-mvc - 如何获取模型子模型属性?mvc asp.net
- python - 在 sqlite3 和 python 中插入表格。“with”关键字的魔力
- sql - SQL between in case in where clause
- python - 如何将 numpy 数组的多个值添加到绘图图例中?
- file - 在 Verilog 中从 txt 读取和写入数组
- matlab - MatLab:生成具有平均 M 和总 T 的泊松分布的 N 个伪随机数,其中 N、M 和 T 是用户定义的
- angular - 在组件angular7中显示当前用户的用户名
- c++ - 使用 suid 安装 debian linux 头文件后无法访问共享库