C# 旋转多维数组的部分
我需要能够通过声明范围和方向来旋转多维数组的一部分 假设我有一个int数组:C# 旋转多维数组的部分,c#,matrix,multidimensional-array,rotation,C#,Matrix,Multidimensional Array,Rotation,我需要能够通过声明范围和方向来旋转多维数组的一部分 假设我有一个int数组: [1, 2, 3, 4] [5, 6, 7, 8] [9, 10, 11, 12] [13, 14, 15, 16] 如果我有一个从[2,2]到[3,3]的范围,顺时针旋转,我会得到: [1, 2, 3, 4] [5, 6, 7, 8] [9, 10, 15, 11] [13, 14, 16, 12] [1, 2, 3, 4] [7, 15, 16, 8] [6, 10, 14, 11] [5, 9, 13, 12
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
[13, 14, 15, 16]
如果我有一个从[2,2]到[3,3]的范围,顺时针旋转,我会得到:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 15, 11]
[13, 14, 16, 12]
[1, 2, 3, 4]
[7, 15, 16, 8]
[6, 10, 14, 11]
[5, 9, 13, 12]
如果我将[0,1]范围应用到[2,3],逆时针旋转,我会得到:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 15, 11]
[13, 14, 16, 12]
[1, 2, 3, 4]
[7, 15, 16, 8]
[6, 10, 14, 11]
[5, 9, 13, 12]
数组将始终是矩阵NxN(2*2,3*3,4*4..)。只是旋转矩阵不是个问题,但我有一个问题,做它只是一个矩阵内的一部分。在C#中我将如何做到这一点?这让我想起了
我不知道你的具体问题是什么-你可以把这个子矩阵作为一个独立的对象,然后旋转它
例如考虑以下算法:
“电路”
“电路”
逐一打开'电路'
中的每个整数,只需计算其新的位置
(一些关于矩阵索引的简单数学)旋转子矩阵的所有回路后,即可得到结果。您需要复制一些行并将它们与列交换。在某些情况下,您可能需要反转它们 下面的代码用您给出的示例解决了您的问题。请注意,此代码仅旋转外圆。例如,如果旋转圆为4x4,则内圈2x2不会旋转。但是你应该明白
static void Main(string[] args)
{
int[,] array = new int[4, 4]
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
Rotate(array, 2, 2, 3, 3, true);
Rotate(array, 1, 0, 3, 2, false);
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.Write(array[i, j] + " ");
}
Console.WriteLine();
}
}
private static void Rotate(int[,] array, int x1, int y1, int x2, int y2, bool clockwise)
{
int[] r1 = CopyFromRow(array, x1, y1, x2 - x1 + 1);
int[] r2 = CopyFromRow(array, x2, y1, x2 - x1 + 1);
int[] c1 = CopyFromColumn(array, x1, y1, y2 - y1 + 1);
int[] c2 = CopyFromColumn(array, x1, y2, y2 - y1 + 1);
if (clockwise)
{
Array.Reverse(c1);
Array.Reverse(c2);
CopyToColumn(array, r1, x1, y2);
CopyToColumn(array, r2, x1, y1);
CopyToRow(array, c1, x1, y1);
CopyToRow(array, c2, x2, y1);
}
else
{
Array.Reverse(r1);
Array.Reverse(r2);
CopyToColumn(array, r1, x1, y1);
CopyToColumn(array, r2, x1, y2);
CopyToRow(array, c1, x2, y1);
CopyToRow(array, c2, x1, y1);
}
}
private static void CopyToColumn(int[,] array, int[] row, int x1, int y1)
{
for (int i = 0; i < row.Length; i++)
{
array[x1 + i, y1] = row[i];
}
}
private static void CopyToRow(int[,] array, int[] col, int x1, int y1)
{
for (int i = 0; i < col.Length; i++)
{
array[x1, y1 + i] = col[i];
}
}
private static int[] CopyFromColumn(int[,] array, int x1, int y1, int length)
{
int[] row = new int[length];
for (int i = 0; i < length; i++)
{
row[i] = array[x1 + i, y1];
}
return row;
}
private static int[] CopyFromRow(int[,] array, int x1, int y1, int length)
{
int[] col = new int[length];
for (int i = 0; i < length; i++)
{
col[i] = array[x1, y1 + i];
}
return col;
}
static void Main(字符串[]args)
{
int[,]数组=新的int[4,4]
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
旋转(数组,2,2,3,3,真);
旋转(数组,1,0,3,2,false);
for(int i=0;i