我们得到一个二维数组 A[n,m]
,其中包含 n
行和 m
列以及该数组的一个元素随机选择R
。
将数组视为循环数组,因为当我们访问 A[n-1, m-1]
时,我们访问的下一个元素将是 A[0, 0]
。
从元素 R
开始,我们希望仅访问每个元素一次,并在移动到下一个元素之前调用函数 foo()
。
以下是我的第一个实现,但有一个错误。错误是,如果我们从 0
和 n-1
之间的行 x
开始,我们将不会访问 0< 中的元素
到该列中的 x-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;
}
什么是一种干净的方式来进行这种遍历,以便我们满足上述要求?
最佳答案
只需移至下一个索引,然后检查是否回到起点,在这种情况下,停止:
// 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);
这并不执行您的实现的操作,而是执行问题标题所要求的操作。
关于c - 给定随机起始元素,精确迭代圆形二维数组的所有元素一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14247250/