问题描述:螺旋式打印一个二维数组。如
1 16 3 2 17
8 6 4 3 23
2 5 7 8 12
21 2 4 6 13
要求打印后顺序为:
1 16 3 2 17 23 12 13 6 4 2 21 2 8 6 4 3 8 7 5
此题的思路有很多中,最容易想到的方法就是设置一个表示方向的变量,根据当前的方向来判断下一步的操作,当到达边界的时候方向顺时针改变。另外有一个bool型的数组来表示相应位置是否被访问过,初始化都是0(未访问),当输出一个数就把相应位置的标记置为1。在前方向上如果碰到已经被访问过的位置就顺时针改变方向,一直到最后所有位置的数都访问位置。
个人觉得上面的算法写出的程序比较繁琐,下面提供一种比较简单的算法。在输出的时候可以给水平方向和垂直方向各设置两个坐标,start_x, end_x, start_y, end_y, 分别表示当前水平方向输出区间应该在start_x和end_x之间,垂直方向输出区间在start_y和end_y直接,每次转弯的时候只需要改变区间的边界就可以了。具体代码如下:
- int arr[6][5]=
- {{1, 16, 3, 2, 17},
- {8, 6, 4, 3, 23},
- {2, 5, 7, 8, 12},
- {21, 2, 4, 6, 13},
- {11, 111, 111, 132, 12},
- {31, 311, 4111, 332, 32}
- };
- void main()
- {
-
- int startX = 0, endX = 4;
- int startY = 0, endY = 5;
-
- while(startX<=endX && startY<=endY)
- {
- int i;
- for(i=startX; i<=endX; i++)
- cout << arr[startY][i] << " ";
- startY ++;
- for(i=startY; i<=endY; i++)
- cout << arr[i][endX] << " ";
- endX --;
- for(i=endX; i>=startX; i--)
- cout << arr[endY][i] << " ";
- endY --;
- for(i=endY; i>=startY; i--)
- cout << arr[i][startX] << " ";
- startX ++;
- }
- }