我有两个任意大小的方形表,需要按照特定的顺序迭代,下面的图片显示了大小为4x4的矩形,其中的值描述了顺序:
我有一个函数F(row,col)
我需要两个最有效的循环,它们将使用之前描述的顺序遍历表并在其中调用F(行,调用)
谢谢,
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
对于第一种情况,试试这个(我假设您使用的是从零开始的索引,如果您使用基于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);
}