Arrays 在(可能是非正方形的)二维阵列的每个元素中沿对角线移动
我在玩c语言中的2d数组,我想知道如何完全和对角地遍历2d数组 水平方向,在尺寸矩阵中Arrays 在(可能是非正方形的)二维阵列的每个元素中沿对角线移动,arrays,c,traversal,Arrays,C,Traversal,我在玩c语言中的2d数组,我想知道如何完全和对角地遍历2d数组 水平方向,在尺寸矩阵中宽度,高度 您只需移动每个索引i,并检查索引j 比如: const int width = 10; const int height = 10; const int mat[width][height] = {0}; for (i = 0, i<width, i++){ for (j = 0; j<height; j++){ mat[i][0] = j; } }
宽度
,高度
您只需移动每个索引i
,并检查索引j
比如:
const int width = 10;
const int height = 10;
const int mat[width][height] = {0};
for (i = 0, i<width, i++){
for (j = 0; j<height; j++){
mat[i][0] = j;
}
}
或使用索引i,j
:
0,0 ->
1,0 -> 0,1 ->
2,0 -> 1,1 -> 0,2 ->
2,1 -> 1,2 -> 0,3 ->
2,2 -> 1,3 ->
2,3
是否有一种直接的方法来命中这些元素(不一定是按照每个元素的顺序,但我认为对角线递增会很有用)
此外,是否可以检查相反方向的对角线?对于对角线遍历,对于回路,仅使用一个
,因为i
和j
是相同的:
for (i = 0, i < min(width, hight), i++){
// something to do with element[i][i]
}
for(i=0,i
这是建议的位置的副本,类似于:
int main(void)
{
int m[3][4] = { 1, 2, 4, 7,
3, 5, 8,10,
6, 9,11,12 };
const int h = 3; /* height*/
const int w = 4; /* width */
for (int diag = 0; diag < (w + h - 1); ++diag)
{
printf("diag %d:",diag);
int i_start = diag < w ? 0 : diag - w + 1;
int i_end = diag < h ? diag + 1 : h;
for (int i = i_start; i < i_end; ++i)
{
printf("%d ",m[i][diag - i]);
}
printf("\n");
}
return 0;
}
用于(int i=0;i在向stackoverflow发布问题之前,您应该腾出所有人的时间,检查主题上已经存在的问题和答案:,这是否回答了您的问题?这不是只穿过中间对角线吗?如何穿过非中间对角线?@johnycode,也只有一个for
循环。Just更改元素[i][i]
中的第二个索引,例如从主对角线向上1:元素[i][i+1]
,次对角线(从右上到左下)元素[i][n-i]
,其中n=min(宽度、高度)
。
int main(void)
{
int m[3][4] = { 1, 2, 4, 7,
3, 5, 8,10,
6, 9,11,12 };
const int h = 3; /* height*/
const int w = 4; /* width */
for (int diag = 0; diag < (w + h - 1); ++diag)
{
printf("diag %d:",diag);
int i_start = diag < w ? 0 : diag - w + 1;
int i_end = diag < h ? diag + 1 : h;
for (int i = i_start; i < i_end; ++i)
{
printf("%d ",m[i][diag - i]);
}
printf("\n");
}
return 0;
}
diag 0:1
diag 1:2 3
diag 2:4 5 6
diag 3:7 8 9
diag 4:10 11
diag 5:12