arrays - “圆”中的遍历矩阵
问题描述
我需要像这样去
我想到的唯一方法是某种蛮力:
int Rings[][] = new int [3][12];
for (int i = 0; i < 3; i++) {
Rings[i][0] = matrix[2-i][5];
Rings[i][1] = matrix[2-i][4];
Rings[i][2] = matrix[2-i][3];
Rings[i][3] = matrix[3][2-i];
Rings[i][4] = matrix[4][2-i];
Rings[i][5] = matrix[5][2-i];
Rings[i][6] = matrix[6+i][3];
Rings[i][7] = matrix[6+i][4];
Rings[i][8] = matrix[6+i][5];
Rings[i][9] = matrix[5][6+i];
Rings[i][10] = matrix[4][6+i];
Rings[i][11] = matrix[3][6+i];
}
//Rings[0] = 9,6,3,7,8,9,1,4,7,3,2,1
//Rings[1] = 8,5,2,4,5,6,2,5,8,6,5,4
//Rings[2] = 7,4,1,1,2,3,3,6,9,9,8,7
如果它是 9x9 看起来还不错,但如果它会更大,即使使用 10x10 阵列“环”也将是 16。是否可以在不接触角元素的情况下以圆形方式通过矩阵?顺时针或逆时针无关紧要,从哪个圆圈开始,也无关紧要。
解决方案
请注意,每个环的 4 个边都有一个不变的索引,并转换为 4 个 for 循环:
for (int i = 0; i < 3; i++)
{
int j = 0;
for (int k = 5; k > 2; k--)
Rings[i][j++] = matrix[2-i][k];
for (int k = 3; k < 6; k++)
Rings[i][j++] = matrix[k][2-i];
for (int k = 3; k < 6; k++)
Rings[i][j++] = matrix[6+i][k];
for (int k = 5; k > 2; k--)
Rings[i][j++] = matrix[6+i][k];
}
推广到网格大小N
:
2 - i
用N - 1
(内循环,左/上)替换 2 in- 将 6 英寸替换为
6 + i
(2 * N
内环,右/下)
代码:
for (int i = 0; i < N; i++)
{
int j = 0;
for (int k = 2 * N - 1; k >= N; k--)
Rings[i][j++] = matrix[N - 1 - i][k];
for (int k = N; k < 2 * N; k++)
Rings[i][j++] = matrix[k][N - 1 - i];
for (int k = N; k < 2 * N; k++)
Rings[i][j++] = matrix[2 * N + i][k];
for (int k = 2 * N - 1; k >= N; k--)
Rings[i][j++] = matrix[2 * N + i][k];
}
推荐阅读
- python - 递归堆栈误导输出
- java - 如何在播放时获取 mp3 的 URL
- android - TextView 超出了 ConstraintLayout
- php - 如何正确处理日期和时间?
- go - golang rabbitmq channel.consume SIGSEGV
- r - 无法安装 R 包“data.table”。- 麦克空气
- swift - 如何从 Button ,Swift 中删除图像?
- c - 为什么我的文件在 C 中分叉时即使在有保护的情况下也会执行此标头两次?
- html - 网站无法识别通过 VBA 代码完成的选择
- javascript - 如何在不转换为数组的情况下按另一个对象内的对象的值排序?