gpt4 book ai didi

c++ - 为什么我的二维数组不旋转?

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:14 25 4
gpt4 key购买 nike

我有一个方形二维数组,我想顺时针和逆时针旋转它。

我在这里按照这个答案向右旋转:

Rotating a 2D pixel array by 90 degrees

我开发的代码:

void rotateRight()
{
for (int i = 0; i < m_width; i += 1) {
for (int j = i + 1; j < m_height; j += 1) {
std::swap(get(i, j), get(j, i));
}
}
}

然而,阵列并没有旋转。我有一个 5 的 10x10 数组,左上角是一个 7。我希望 7 旋转后会转到右上角,但它仍然在左上角。

成员函数 get() 是我自己的,它只返回对单元格的引用。

T& get(const int x, const int y)
{
return m_array[y * m_width + x];
}

我怎样才能让它旋转?是否必须制作一个新阵列?非常感谢您的帮助。谢谢!

更新:

最新尝试。好的,所以“7”最终从左上角向右旋转到右上角。但是当再次调用 rotateRight() 时,它失败了。我右上角的 7 不见了,再也找不到了。正在研究它。

for (int i = 0; i < m_width; i += 1) {
for (int j = i + 1; j < m_height; j += 1) {
get(j, i) = get(i, j);
}
}
for (int i = 0; i < m_height; i++) {
for (int j = 0, k = m_height - 1; j<k; j++, k--) {
std::swap(get(j, i), get(k, i));
}
}

输出:

Original:
700
000
000

Rotation #1:
J: 1, I: 0
J: 2, I: 0
J: 2, I: 1
J: 0, I: 0, K: 2
Value: 7 J: 0 K: 2
J: 0, I: 1, K: 2
Value: 0 J: 0 K: 2
J: 0, I: 2, K: 2
Value: 0 J: 0 K: 2
007
000
000

Rotation #2:
J: 1, I: 0
J: 2, I: 0
J: 2, I: 1
J: 0, I: 0, K: 2
Value: 0 J: 0 K: 2
J: 0, I: 1, K: 2
Value: 0 J: 0 K: 2
J: 0, I: 2, K: 2
Value: 0 J: 0 K: 2
000
000
000

最终代码

// Rotates a squared array clockwise.
void rotateRight()
{
T temp;
int halfwidth_floor = m_width / 2;
int halfwidth_ceil = (m_width + 1) / 2;

for (int j = 0; j < halfwidth_floor; j += 1) {
for (int i = 0; i < halfwidth_ceil; i += 1) {
std::swap(temp, get(i, j));
std::swap(get(i, j), get(j, m_width - i - 1));
std::swap(get(j, m_width - i - 1), get(m_width - i - 1, m_width - j - 1));
std::swap(get(m_width - i - 1, m_width - j - 1), get(m_width - j - 1, i));
std::swap(get(m_width - j - 1, i), temp);
}
}
}

// Rotates a squared array counter-clockwise.
void rotateLeft()
{
T temp;
int n = m_width;

for (int i = 0; i < n / 2; i++) {
for (int j = i; j < n - i - 1; j++) {
std::swap(temp, get(i, j));
std::swap(get(i, j), get(n - j - 1, i));
std::swap(get(n - j - 1, i), get(n - i - 1, n - j - 1));
std::swap(get(n - i - 1, n - j - 1), get(j, n - i - 1));
std::swap(get(j, n - i - 1), temp);
}
}
}

最佳答案

内部循环的每次迭代都是将 (i, j) 与 (j, i) 交换。

如果 (i == j),那么它什么都不做。

如果 (i != j),那么交换将完成两次 - 例如,当 i == 3 和 j == 4 时完成的交换将在 i == 4 和 j == 3 时再次完成。进行两次交换当然不会导致整体发生任何事情。

这就是为什么您的代码将以一个与开始时完全相同的数组结束。

您可能想要做的是写入一个不同的数组,而不是您开始使用的数组。

编辑:没关系,我错过了问题的 int j = i + 1 部分,并认为两个循环都是从 0 迭代到宽度或高度。 (不过,对于任何想做同样事情的人来说,以上内容可能仍然是有用的见解。)

您的代码将转置,而不是旋转数组。 (转置意味着从左上角到右下角沿对角线反射。)要旋转,您需要将每个元素 (i, j) 移动到 (j, w-i-1) 或 (h-j-1, i)。 (当然,要旋转 90 度,您的数组需要是正方形,即 (w == h))。

编辑 2:

如果您想就地旋转一个方形数组,旋转 90 度,std::swap 将不起作用(因为它交换了 2 个元素),原始赋值也不起作用(因为它丢失了信息)。不过,您可以做的是迭代数组的四分之一并旋转 4 个元素的序列,如下所示:

void rotateRight()
{
int halfwidth_floor = m_width / 2;
int halfwidth_ceil = (m_width + 1) / 2;
for (int j = 0; j < halfwidth_floor; j += 1) {
for (int i = 0; i < halfwidth_ceil; i += 1) {
value_type temp = get(i, j);
get(i, j) = get(j, m_width-i-1);
get(j, m_width-i-1) = get(m_width-i-1, m_width-j-1);
get(m_width-i-1, m_width-j-1) = get(m_width-j-1, i);
get(m_width-j-1, i) = temp;
}
}
}

其中 value_type 是数组元素的类型(并且 m_width == m_height)。

在第一次迭代中,这会将左下移动到左上,然后将右下移动到左下,然后将右上移动到右下,然后(临时保存的)左上移动到右上。随后的迭代将对其他点执行相同的操作,越来越接近中心。请注意,一个 for 循环迭代到大小的一半向下舍入,而另一个循环向上舍入:这样一来,在一个奇数大小的数组(例如 5x5)中,它将查看 2x3 的矩形和它围绕正方形“旋转”,以避免旋转中间元素两次(或根本不旋转)。

关于c++ - 为什么我的二维数组不旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49395256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com