【发布时间】:2018-03-20 22:37:15
【问题描述】:
我有一个平方二维数组,我想顺时针和逆时针旋转。
我在这里按照这个答案向右旋转:
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);
}
}
}
【问题讨论】:
-
一个简短的说明,说正确地做一个 2D 数组做得很好,具有 1D 存储和索引包装器!
-
你在做什么(交换
i和j)相当于反射数组围绕它的前导对角线,而不是旋转它。另外,如果width和height不相等,您期望的行为是什么? (必须“缩小”阵列或将其部分切除) -
附带说明:有一个std::rotate 函数。
-
@Ron 我不认为该功能意义上的旋转是 OP 想要的
-
我只对平方旋转感兴趣。
标签: c++