0

A[n,m]我们得到一个包含n行和列的二维数组,以及m随机选择的该数组的一个元素R。将数组视为循环的,因为当我们访问A[n-1, m-1]下一个元素时,我们将访问A[0, 0].

从 element 开始R,我们希望只访问每个元素一次并foo()在移动到下一个元素之前调用函数。

以下是我的第一个实现,但有一个错误。错误是,如果我们从 和 之间的某处开始,x我们将不会访问该列中的元素。0n-10x-1

// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();

// Look at each column once
for (int i = 0; i < m; ++i) 
{
  for (; curr_row < n; ++curr_row) 
  {
    foo(A[curr_row][curr_col]);
  }
  curr_row = 0;
  curr_col = (curr_col + 1) % m;
}

为了满足上述要求,进行这种遍历的干净方法是什么?

4

3 回答 3

1

对 c 很生疏,但应该是一样的:

// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();

//first row
for(int j=curr_col;j<m;++j)
  foo(A[curr_row][j]);

//rest of the rows
for(int i=(curr_row+1)%n;i!=curr_row;i=(i+1)%n)
  for(int j=0;j<m;++j)
      foo(A[i][j]);

//first row , going over missed cells
for(int j=0;j<curr_col;++j)
  foo(A[curr_row][j]);

如果您非常关心性能,您还可以划分第二个循环,这样根本就不会出现“%”。

另一种选择,因为 C 在一个简单的数组中有 2d 数组:

// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();

int start=curr_row*m+curr_col;
int maxCell=n*m;
int end=(start-1)%maxCell;    

for(int i=start;i!=end;i=(i+1)%maxCell)
  foo(A[i]);
foo(A[end]);

可能会有一个小小的数学错误,但这个想法是可以的。

于 2013-01-09T22:11:19.647 回答
1

只需移动到下一个索引,并检查您是否回到起点,在这种情况下,停止:

// should be something that guarantees in-range indices
curr_row = rand();
curr_col = rand();
int i = curr_row, j = curr_col;
do {
    foo(A[i][j]);
    ++j;
    if (j == n) {
        j = 0;
        ++i;
        if (i == m) {
            i = 0;
        }
    }
}while(i != curr_row || j != curr_col);

这不是你的实现所做的,而是问题标题所要求的。

于 2013-01-09T22:16:54.733 回答
-1

A[curr_row, curr_col]不是用于访问多维数组成员的语法相反,你想要A[curr_row][curr_col],假设数组被正确声明。A[curr_row, curr_col]将调用逗号运算符,它有效地计算第一个值,然后将其丢弃并计算第二个值,然后用该值索引数组。

于 2013-01-09T22:15:18.067 回答