0

我有两个任意大小的方表,需要以非常特定的顺序进行迭代,下图显示了大小为 4x4 的矩形,其值描述了顺序:

矩形

我有一个函数F(row,col),我需要两个最有效的循环,它们将使用前面描述的顺序遍历表并在其中调用 F(row, call)

谢谢,

4

2 回答 2

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);
}
于 2013-08-22T12:29:49.487 回答
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);
    }
}        
于 2013-08-22T11:41:58.103 回答