如何优雅实现二维数组的8种镜像与旋转遍历方式?
优雅实现矩形数组的8种遍历场景(镜像+旋转组合)
当需要遍历矩形二维数组并支持X轴镜像、Y轴镜像、对角线旋转的所有组合(共2×2×2=8种场景)时,重复写8套嵌套循环确实既冗余又难维护。这里分享一种通过位标记统一控制变换逻辑的方案,只用一套循环就能覆盖所有场景:
实现代码
int sx = 3; int sy = 2; var a = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, }; for (int order = 0; order < 8; order++) { var mirrorX = (order & 1) != 0; var mirrorY = (order & 2) != 0; var mirrorDiag = (order & 4) != 0; for (int i = 0; i < sx * sy; i++) { // 根据对角线旋转标记,切换x/y的计算逻辑 int x = mirrorDiag ? i % sx : i / sy; int y = mirrorDiag ? i / sx : i % sy; // 应用X轴镜像变换 if (mirrorX) { x = sx - x - 1; } // 应用Y轴镜像变换 if (mirrorY) { y = sy - y - 1; } Console.Write(a[y, x]); } Console.WriteLine(); }
输出结果
142536
362514
415263
635241
123456
321654
456123
654321
思路说明
- 用
order变量的3个二进制位分别对应X轴镜像(第0位)、Y轴镜像(第1位)、对角线旋转(第2位),通过位运算快速判断当前需要启用哪些变换 - 把二维遍历转换成一维索引遍历,再根据变换规则将一维索引映射回二维坐标,避免了嵌套循环的重复编写
- 所有变换逻辑都集中在坐标计算环节,核心遍历逻辑只需要写一次,后期调整变换规则也更方便
内容的提问来源于stack exchange,提问作者mafu
相关产品推荐
相关产品推荐

