gpt4 book ai didi

c - 逆时针遍历二维数组的周长

转载 作者:行者123 更新时间:2023-11-30 15:07:47 24 4
gpt4 key购买 nike

这是我在 Stack Overflow 上的第一个问题,因此如果我没有正确遵循社区准则和约定,请告诉我。

第 0 行第 0 列(最好不重新访问每个元素)以逆时针(或顺时针)方向遍历 2D 数组的周长的巧妙方法是什么)?

直观上,我可以依次为每个方向编写四个 for 循环(即编写一个 for 循环来遍历左列,然后编写一个 for 循环遍历底行,依此类推)。但这个解决方案感觉“硬编码”。

是否存在一种“捷径”方法可以利用对此模式的一些关键见解?这种快捷方法在程序运行时是否也很高效?

提前致谢。

<小时/>

编辑特异性:

具体来说,我尝试从 第 0 行第 0 列 逆时针遍历这个二维数组,并仅打印每个元素一次。

假设数组如下所示:
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

这是我当前的解决方案(该解决方案有效):

//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]);

就我个人而言,我的解决方案似乎简单且重复。我想知道是否有更有创意的解决方案。

如果需要更多说明,请告诉我。

最佳答案

就我个人而言,我认为您所描述的“硬编码”的四个循环确实是最好、最清晰的解决方案。也就是说,对于数组[N][M],一个循环中有两个选项:

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;
}
}

或者

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) 对于所有整数类型。

说明:

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

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

关于c - 逆时针遍历二维数组的周长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com