【发布时间】:2016-03-25 06:48:37
【问题描述】:
这确实是一个概念性(与语言无关)的问题,但为了解释起见,我将使用 C++。我更喜欢可以移植到其他语言的答案(没有指针算术或内存技巧)。
假设我们有:
-
arr,我们的 rectangular 一些任意类型的二维数组T -
void shift(int dx, int dy),执行“旋转”的函数 -
numRows,行数 -
numCols,列数
shift() 移动数组以使所有行都向下移动dx 位置,并且超出边界的行将环绕到开头。 (对于列和dy 也是如此。)假设这就是我们的数组最初的样子:
{{a1, a2, a3, a4},
{b1, b2, b3, b4},
{c1, c2, c3, c4},
{d1, d2, d3, d4}};
调用函数后:shift(2,1),arr 应该是这样的:
{{c4, c1, c2, c3},
{d4, d1, d2, d3},
{a4, a1, a2, a3},
{b4, b1, b2, b3}};
在本例中,dx 为 2,所以所有内容都向下移动了两个位置,dy 为 1,所以所有内容也移到了右边一个地方。
这是我解决这个问题的方法:
void shift(int dx, int dy)
{
T newArr[numRows][numCols];
for(int r = 0; r < numRows; r++)
{
for(int c = 0; c < numCols; c++)
newArr[(r + dx) % numRows][(c + dy) % numCols] = arr[r][c];
}
for(int r = 0; r < numRows; r++)
{
for(int c = 0; c < numCols; c++)
arr[r][c] = newArr[r][c];
}
}
我对这段代码不满意,因为它既不节省时间也不节省空间。我正在寻找一种更优雅的解决方案,它可以用更少的循环完成更多工作并且使用更少的内存。
【问题讨论】:
-
我不明白你为什么需要 4 个 for 循环来解决这个问题。你能展示你的代码吗?
-
@IvanGritsenko 抱歉,如果这太晚了,但我已经用更多细节更新了我的问题。
标签: arrays multidimensional-array language-agnostic swap