You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的二维方阵无法旋转?顺时针/逆时针旋转问题求助

解决二维方阵顺时针/逆时针旋转的问题

嘿,我发现你的问题啦!你现在写的代码只完成了矩阵转置这一步,但顺时针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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:11:31