【问题标题】: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,用于反击 :-)

标签: c++ arrays zigzag


【解决方案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)&amp;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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 2016-09-04
      相关资源
      最近更新 更多