旋转表迭代

时间:2013-08-22 11:38:24

标签: c# java c algorithm loops

我有两个任意大小的方形表,需要按照特定的顺序迭代,下面的图片显示了大小为4x4的矩形,其中的值描述了顺序:

Rectangles

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

谢谢,

2 个答案:

答案 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);
}