为何我的二维方阵无法旋转?顺时针/逆时针旋转问题求助
解决二维方阵顺时针/逆时针旋转的问题
嘿,我发现你的问题啦!你现在写的代码只完成了矩阵转置这一步,但顺时针90度旋转需要两步才能完成——转置之后还得反转每一行,这就是为什么你的元素没跑到预期位置~
问题出在哪?
你这段代码:
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)); } } }
仅仅是把矩阵的行和列互换了(也就是转置),但这还不是完整的顺时针旋转。比如你左上角的元素7,转置后还在(0,0)位置,没有移动到右上角。只有在转置后把每一行的元素左右反转,才能让它跑到(0,9)(10x10数组的右上角)。
修正后的顺时针旋转代码
这里给你补全完整的顺时针90度旋转逻辑:
void rotateRight() { // 第一步:转置矩阵(行变列) for (int i = 0; i < m_width; ++i) { for (int j = i + 1; j < m_height; ++j) { std::swap(get(i, j), get(j, i)); } } // 第二步:反转每一行的元素 for (int i = 0; i < m_height; ++i) { for (int j = 0; j < m_width / 2; ++j) { std::swap(get(i, j), get(i, m_width - 1 - j)); } } }
这样运行后,你左上角的7就会准确移动到右上角啦~
顺便给你逆时针旋转的实现
如果之后需要逆时针90度旋转,逻辑类似,转置后反转每一列就行:
void rotateLeft() { // 第一步:转置矩阵 for (int i = 0; i < m_width; ++i) { for (int j = i + 1; j < m_height; ++j) { std::swap(get(i, j), get(j, i)); } } // 第二步:反转每一列的元素 for (int j = 0; j < m_width; ++j) { for (int i = 0; i < m_height / 2; ++i) { std::swap(get(i, j), get(m_height - 1 - i, j)); } } }
小提示
因为你用的是方阵,m_width和m_height是相等的,你可以定义一个变量n = m_width,让代码更简洁易懂哦~
内容的提问来源于stack exchange,提问作者Phil C
相关产品推荐
相关产品推荐

