在给定随机起始元素的情况下,一次迭代圆形2D阵列的所有元素

时间:2013-01-09 21:58:10

标签: c multidimensional-array iteration

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

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

以下是我的第一个实现,但有一个错误。如果我们从x0之间的某个行n-1开始,我们就不会访问该列中0x-1的元素。< / p>

// 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;
}

进行此遍历的干净方法是什么,以便我们满足上述要求?

3 个答案:

答案 0 :(得分: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]);

可能会有一个微小的数学错误,但这个想法没问题。

答案 1 :(得分: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);

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

答案 2 :(得分:-1)

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