首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逆时针方向遍历二维阵列的周长

逆时针方向遍历二维阵列的周长
EN

Stack Overflow用户
提问于 2016-06-21 19:40:53
回答 1查看 2.3K关注 0票数 0

这是我关于堆栈溢出的第一个问题,如果我没有正确地遵循社区指南和惯例,请告诉我。

在逆时针方向(或顺时针方向)从row 0column 0 (最好不需要重新访问每个元素)遍历2D数组的周长的聪明方法是什么?

直观地,我可以顺序地为每个方向编写四个for循环(即编写一个for循环来遍历左列,然后编写一个for循环来遍历底部行,等等)。但是这个解决方案感觉是“硬编码”。

是否有一种“快捷”方法可以利用对这种模式的一些关键洞察力?这种快捷方法在程序运行时也是有效的吗?

提前谢谢。

编辑以求具体性:

具体来说,我试图逆时针地从row 0column 0遍历这个2D数组,并且只打印一次每个元素。

假设数组如下所示:

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20

我的预期输出如下:1, 6, 11, 16, 17, 18, 19, 20, 15, 10, 5, 4, 3, 2

以下是我目前的解决方案(此解决方案有效):

代码语言:javascript
复制
//Loop through the left side.
int i;
for (i = 0; i < rows; i++)
    printf("%d, ", array[i][0]);

//Loop through the bottom side.
for (i = 1; i < columns; i++)
    printf("%d, ", array[rows-1][i]);

//Loop through the right side.
for (i = rows-2; i >= 0; i--)
    printf("%d, ", array[i][columns-1]);

//Loop through the top side.
for (i = columns-2; i > 1; i--)
    printf("%d, ", array[0][i]);

//Print the last element.
printf("%d.\n", array[0][1]);

就我个人而言,我的解决方案似乎是直截了当和重复的。我想知道是否有更有创意的解决办法。

如果还需要更多的澄清,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-21 19:53:21

就我个人而言,我认为您描述为“硬编码”的四个循环确实是最好和最清晰的解决方案。尽管如此,下面是一个arrayN循环中的两个选项

代码语言:javascript
复制
for(int row = 0, col = 0, i = 0; i < 4;) {
  //process
  switch(i) {
    case 0: 
      if(++row == N)
        ++i;
      break;
    case 1: 
      if(++col == M)
        ++i; 
      break;
    case 2: 
      if(--row == 0)
        ++i;
      break;
    case 3:
      if(--col == 0)
        ++i;
      break;
  }
}

代码语言:javascript
复制
int dirs[][] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

for(int row = 0, col = 0, i = 0; i < 4;) {
  //process
  if( dirs[i][0] && ((row += dirs[i][0]) == 0 || row == N) ||
      dirs[i][1] && ((col += dirs[i][1]) == 0 || col == M))
    ++i;
}

注意:所有与0的比较都可以用否定代替。所有整数类型的(a == 0) == (!a)

解释:

这两种解决方案都利用了沿某个方向前进直到达到最大值/分钟的想法,并增加计数器以跟踪状态。一个使用开关语句来处理状态,另一个使用内存中的数组。对于第二种解决方案,我们只在要更改的东西(行或行)达到最大值或分钟时才切换状态。我们不关心变化为0的值是在最大值还是最小值,这不会改变状态。

不过,我要重申,最好的解决方案是使用您提到的四个循环,并避免重复,在每个循环中调用一个函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37953218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档