【问题标题】:Rotated table iteration旋转表迭代
【发布时间】:2013-08-22 11:38:23
【问题描述】:

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

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

谢谢,

【问题讨论】:

  • 你取得了什么进展?
  • 你的函数 F 是做什么的?您的问题只是关于性能,还是您在让轮换工作时遇到问题?
  • 我已经花了几个小时写了那个循环,要么我喝醉了,要么我不知道是什么原因阻止了我
  • 我只需要以或多或少的最佳方式执行迭代
  • 这很有趣,埃里克,在开玩笑之前试着写下那个循环

标签: c# java c algorithm loops


【解决方案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);
    }
}        

【讨论】:

  • 这不起作用,它会调用 F(0,0)、F(0,-1)、F(0,-2) .. F(1,0) 等。跨度>
【解决方案2】:

对于第一种情况,试试这个(我假设您使用从零开始的索引,如果您更喜欢从 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);
}

【讨论】:

  • 谢谢你,morgano,我不得不选择 Thomas 的回答作为答案,因为他首先回答了,但是投票赞成你和你的其他答案!
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多