嗨,我需要知道如何将数组旋转180度。目前我可以让它旋转90度,但不能让它进一步旋转。如果有人可以帮助我,那将是很好的,因为我已经被困在这个问题上几天了。谢谢,这是我的代码:
namespace Question_2_1_
{
class Program
{
static void Main(string[] args)
{
int[,] array = new int[4, 4] {
{ 1,2,3,4 },
{ 5,6,7,8 },
{ 9,0,1,2 },
{ 3,4,5,6 } };
int[,] rotated = RotateMatrix(array, 4);
var rowCount = array.GetLength(0);
var colCount = array.GetLength(1);
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < colCount; j++)
{
Console.Write(String.Format("{0}", rotated[i, j]));
}
Console.Write(Environment.NewLine);
}
Console.ReadLine();
}
static int[,] RotateMatrix(int[,] matrix, int n)
{
int[,] ret = new int[n, n];
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
ret[i, j] = matrix[n - j - 1, i];
}
}
return ret;
}
}
}
答案 0 :(得分:0)
您说您想要就地旋转,但您的rotate方法会返回一个新数组。就地旋转意味着您可以修改矩阵本身,而无需创建新矩阵
但是,如果旋转90度,如果矩阵是方形的,当然只能就地旋转
但是,如果旋转180度,则可以始终就地旋转。我们采用非方矩阵:
{ a, b, c, d, e, f },
{ g, h ,i, j, k, l },
{ m, n, o, p, q, r }
如果我们将它旋转180度,我们最终得到:
{ r, q, p, o, n, m },
{ l, k, j, i, h, g },
{ f, e, d, c, b, a }
您可以看到[r,c]处的项目最终位于[#rows - r - 1,#column - c - 1]。 (当然是0),
所以[0,1]处的b结束于[3 - 0 - 1,6 - 1 - 1]
您可以使用的方法是:首先交换a和r,然后交换b和q等。
这类似于反转一维阵列,只有2维
就像倒转一维阵列一样,我们只走了一半:
我们交换的最后两项是i和j。
我将方法设为通用,因此您可以使用它旋转任何矩阵。
static void Rotate180<T>(T[,] matrix) {
int rowCount = matrix.GetLength(0), columnCount = matrix.GetLength(1);
int max = rowCount * columnCount / 2, m = 0;
for (int r = 0; ; ++r) {
for (int c = 0; c < columnCount; ++c) {
Swap(matrix, r, c, rowCount - r - 1, columnCount - c - 1);
if (++m >= max) return;
}
}
}
static void Swap<T>(T[,] matrix, int r1, int c1, int r2, int c2) {
T temp = matrix[r1, c1];
matrix[r1, c1] = matrix[r2, c2];
matrix[r2, c2] = temp;
}
答案 1 :(得分:0)
您正在寻找的答案是:
ret[i, j] = [n - (i + 1), n - j - 1];
然而,由于您正在创建一个完全不同的阵列,因此这不是就位的&#34; ret&#34;
答案 2 :(得分:0)
首先反转列,然后是行。
class Program
{
static void Main(string[] args)
{
var A = new int[,] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
RotateMatrix180(ref A);
// A = {{16,15,14,.. }, .. , { ..3,2,1} }
}
public static void RotateMatrix180<T>(ref T[,] matrix)
{
int n = matrix.GetLength(0), m = matrix.GetLength(1);
if(n!=m) { /* error */ }
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n/2; j++)
{
T temp = matrix[i, j];
matrix[i, j]=matrix[i,n-j-1];
matrix[i, n-j-1]=temp;
}
}
for(int i = 0; i<n/2; i++)
{
for(int j = 0; j<n; j++)
{
T temp = matrix[i, j];
matrix[i, j]=matrix[n-i-1, j];
matrix[n-i-1, j]=temp;
}
}
}
}
PS。我添加了ref
关键字,以明确该函数修改现有数组。没有它,代码将一样工作,因为数组总是引用类型。