请注意,沿着每个对角线,差异* i - j
是恒定的.所以你有一个嵌套的双循环,其中外部循环区别于:
第一轮:差异-14, arr[0][14]
第二轮:差异-13 arr[0][13]
,arr[1][14]
...
最后一轮:差异+9 , arr[9][0]
.
在代码中:
for (int d = -14; d < 10; ++d)
{
for (int i = 0; i < d + 15 && i < 10; ++i)
{
if (i < d) continue;
// access arr[i][i - d];
printf("[%d, %d]\n", i, i - d);
}
}
Run Code Online (Sandbox Code Playgroud)
注意数字10
和15
代码的外观; 图片很容易推广到任意数组边界.
*)或者,正如@Alexey指出的那样,总和 i + j
是恒定的,取决于图片中原点的位置; 在这种情况下,修改循环如下:
for (int d = 0; d <= 9 + 14; ++d)
{
for (int i = 0; i <= d && i < 10; ++i)
{
if (i + 15 <= d) continue;
// use arr[i][d - i];
}
}
Run Code Online (Sandbox Code Playgroud)