如何以锯齿形顺序遍历 2D 数组
How to traverse a 2D array in zigzag order
我们有一个int
的二维数组,如下所示:
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
我的问题是:我们如何以锯齿形顺序遍历 2D 数组。例如,按如下方式打印出数组值:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
怎么样
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() 或条件的情况下解决原始问题):
#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;
}
}
诀窍是您希望列计数增加一行,减少下一行,依此类推。 这就是递增变量的原因。
"向后"只是一个布尔值,它告诉我们是向后还是向前,从而设置正确的索引开始。
这是一个具有单个for
循环的解决方案。
#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
来为您提供行。第二个[]
分 2 个步骤给出列。它在除以 4 -> x%4
后获取提醒,如果是偶数行,则乘以 1> (x/4+1)&1
然后以相反的顺序添加提醒 -> 3-x%4
如果是奇数行,则乘以 1> (x/4)&1
一种更简单易懂的方法
#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;
}
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 避免在遍历 IShellItemArray 时出现代码重复
- 从特定键开始遍历地图
- 如何遍历 2D 阵列?
- 如何修复我的代码并使其遍历 2D 数组中的所有行?(C++)
- 无法在C++中遍历2D数组
- 如何以锯齿形顺序遍历 2D 数组