如何以之字形顺序遍历二维数组
Posted
技术标签:
【中文标题】如何以之字形顺序遍历二维数组【英文标题】:How to traverse a 2D array in zigzag order 【发布时间】:2014-04-04 15:52:45 【问题描述】:我们有一个int
2D 数组,如下所示:
int matrix[4][4] =
1,2,3,4
5,6,7,8
9,10,11,12
13,14,15,16;
按照惯例,如果我们想按顺序打印出数组,我们可以:
for (int x=0; x<4; x++)
for (int y=0; y<4; y++)
cout << matrix[x][y] << " ";
cout << endl;
输出:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
我的问题是:我们如何才能以之字形顺序遍历二维数组。例如,这样打印出数组值:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
【问题讨论】:
如果您对此投反对票,请在此处留下评论您为什么这样做。所以下次我可以改进。 这个问题似乎离题了,因为它缺乏足够的信息来诊断问题。更详细地描述您的问题或在问题本身中包含一个最小示例。 @πάνταῥεῖ 您还需要从这个问题中获得哪些其他信息?这个问题就像您在此处看到的一样直截了当。 你应该在这里展示你自己的一些努力,你已经尝试过的等等。所以不是 Gimme teh codez plz! 服务。 +1,用于反击 :-) 【参考方案1】:怎么样
bool r=false;
for (int x=0; x<4; x++)
for (int y=0; y<4; y++)
cout << matrix[x][r ? 3-y : y] << " ";
cout << endl;
r = !r;
【讨论】:
我认为 ?算作 if() 指令。但是让OP决定。在 OP 编辑问题之前,说明是不要在解决方案中使用 if() 。 @PaulMcKenzie 哦,我从未见过这种约束。与问题的代码相比,我尝试进行最小的更改,因此它不一定是高效、优雅或任何东西。 还是给了你+1。现在不要在 OP 的帖子中看到它。【参考方案2】:这是一个解决方案(在您编辑原始问题之前,您要求在不使用 if() 或条件的情况下解决原始问题):
#include <iostream>
using namespace std;
int main()
int matrix[4][4] =
1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16;
bool backwards = false;
int incre = 1;
for (int x=0; x < 4; x++)
int index = 3 * backwards;
for (int y=0; y<4; y++, index += incre)
cout << matrix[x][index] << " ";
incre = -incre;
backwards = !backwards;
cout << endl;
诀窍是您希望列数增加一行,减少下一行,等等。这就是 incre 变量的原因。
“向后”只是一个布尔值,它告诉我们是向后还是向前,从而设置正确的索引开始。
【讨论】:
+1 给你。我正在寻找与此类似的解决方案【参考方案3】:这是一个带有单个 for
-loop 的解决方案。
#include <iostream>
using namespace std;
int matrix[][4] = 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15;
int main()
for (int x=0; x<16; x++)
cout << matrix[x/4][ x%4 * ((x/4+1)&1) + (3-x%4)*((x/4)&1) ] << " ";
if (x%4==3) cout << endl;
return 0;
第一个[]
只是将行除以4 -> i/4
。
第二个[]
分两步给出列。它在除以 4 -> x%4
后获取提醒,如果它是偶数行,则乘以 1 -> (x/4+1)&1
然后以相反的顺序添加提醒 -> 3-x%4
如果它是奇数行,则乘以 1 -> @ 987654329@
【讨论】:
【参考方案4】:更简单易懂的方法
#include <iostream>
using namespace std;
int main()
// your code goes here
int matrix[4][4] = 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15;
bool forward = true;
int j;
for(int i = 0,k=0;i<4;i++)
if(forward)
for(j=0;j<4;j++)
cout<<matrix[i][j]<<" ";
cout<<endl;
forward = false;
else
for(j=3;j>=0;j--)
cout<<matrix[i][j]<<" ";
cout<<endl;
forward = true;
return 0;
【讨论】:
以上是关于如何以之字形顺序遍历二维数组的主要内容,如果未能解决你的问题,请参考以下文章