C语言箭头矩阵复制与多次90度顺时针旋转故障排查
箭头矩阵顺时针90度旋转问题修复
我需要将一个箭头矩阵复制到另一个矩阵,并将箭头顺时针旋转90度。目前已实现从指向3点方向旋转到6点方向,但尝试再次旋转到9点方向时,箭头又回到了3点方向。我认为问题在于需要从末尾开始取整列,但不确定具体实现方法。
原代码如下:
#include <stdio.h> #include <string.h> void DisplayArray2D(char arr[][7]); void RotateArray2D(char arrRotated[][7], char arrOriginal[][7]); void main() { char arr[7][7] = { { '*',' ',' ',' ',' ',' ',' '}, { '*','*',' ',' ',' ',' ',' '}, { '*','*','*',' ',' ',' ',' '}, { '*','*','*','*','*','*','*'}, { '*','*','*',' ',' ',' ',' '}, { '*','*',' ',' ',' ',' ',' '}, { '*',' ',' ',' ',' ',' ',' '}, }; char arr6[7][7]; char arr9[7][7]; DisplayArray2D(arr); RotateArray2D(arr6,arr); DisplayArray2D(arr6); RotateArray2D(arr9,arr6); DisplayArray2D(arr9); } void DisplayArray2D(char arr[][7]){ for (int i = 0; i < 7; i++) { for (int j = 0; j < 7; j++) { printf("%c",arr[i][j]); } printf("\n"); } } void RotateArray2D(char arrRotated[][7], char arrOriginal[][7]){ for (int i = 0; i < 7; i++) { for (int j = 0; j < 7; j++) { arrRotated[j][i] = arrOriginal[i][j]; } } }
问题分析
当前的RotateArray2D函数仅做了矩阵转置(行与列互换),并非真正的顺时针90度旋转。转置操作执行两次后会还原为原矩阵,这就是第二次旋转后箭头回到3点方向的原因。
顺时针90度旋转的正确逻辑是:将原矩阵的每一列从下到上取出,作为新矩阵的每一行从左到右排列。对于7×7的矩阵,原矩阵中位置(i,j)的元素,顺时针旋转90度后会对应新矩阵的(j, 6-i)位置(矩阵边长为7,下标从0开始,6=7-1)。
修改后的旋转函数
将RotateArray2D函数替换为以下实现:
void RotateArray2D(char arrRotated[][7], char arrOriginal[][7]){ int n = 7; // 清空目标矩阵,避免残留未初始化的垃圾值 memset(arrRotated, ' ', sizeof(char)*7*7); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // 顺时针90度旋转的坐标映射 arrRotated[j][n-1 - i] = arrOriginal[i][j]; } } }
修改后,第一次旋转可将3点方向箭头转为6点方向,第二次旋转会进一步转为9点方向,完全符合预期。加入memset是为了清空目标矩阵,避免未初始化的垃圾字符干扰显示效果。
内容的提问来源于stack exchange,提问作者Rimidelo
相关产品推荐
相关产品推荐

