我有两个任意大小的方表,需要以非常特定的顺序进行迭代,下图显示了大小为 4x4 的矩形,其值描述了顺序:
我有一个函数F(row,col)
,我需要两个最有效的循环,它们将使用前面描述的顺序遍历表并在其中调用 F(row, call)
谢谢,
对于第一种情况,试试这个(我假设你使用从零开始的索引,如果你喜欢从 1 开始,只需使用F(row + 1, col + 1)
):
int DIM = 3; // dimention of the table - 1, in this case 4 (4 - 1 = 3)
int col = 0;
int row = 0;
for(int x = 0; x < (DIM + 1) * (DIM + 1); x++) {
F(row, col); // your function
int lastRow = row;
row = (col == DIM)? DIM: (row == 0? col + 1: row - 1);
col = (col == DIM)? lastRow + 1: (lastRow == 0? 0: col + 1);
}
对于第二种情况,几乎相同,不同之处在于您调用函数的方式(与另一种情况相同,如果您使用基于 1,请将函数中的参数替换为F(DIM - row + 1, DIM - col + 1)
):
int col = 0;
int row = 0;
for(int x = 0; x < (DIM + 1) * (DIM + 1); x++) {
F(DIM - row, DIM - col); // your function
int lastRow = row;
row = (col == DIM)? DIM: (row == 0? col + 1: row - 1);
col = (col == DIM)? lastRow + 1: (lastRow == 0? 0: col + 1);
}
这应该可以解决第一个和第二个方块的问题:
for (int i = 0, n = size + size - 1; i < n; i++) {
int j = min(i, size - 1);
for (int col = i - j; col <= j; col++) {
int row = i - col;
/* case 1 */
F(row, col);
/* case 2 */
F(size - row - 1, size - col - 1);
}
}