请问如何顺时针打印矩阵?
题目是:
给定一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数组。
也就说打印顺序为:
----------------------------->
| ------------------------> |
| | | |
| <-----------------------| |
| |
<---------------------------
例如矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
按照此规则输出顺序为:
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
-----------------------------------------------
谢谢!
[解决办法]
就判断前面(可能向右,向左,向下,向上)一个位置是否已经取过,或者已经到边界,如果是,则改变方向取顺时针方90度方向的位置,否则直接取数据。一直到数据取完为止。假设当前点位置是(x1,y1),向前的位置是(x2,y2),则改变方向后的下个点的位置为(y2-y1+x1,x1+y1-x2).
[解决办法]
对m行n列矩阵,下个点的位置增量可能为(1,0),(0,1),(-1,0),(0,-1),每次选取方向改变了,也就是位置增量变成下一个了,依次循环。取出的数据,在第n,n+m-1,2*n+m-2,2*n+2*m-4这4个位置的地方,选取方向要改变。每4次方向改变,m和n各减2,继续取数据。直到m和n为0或-1,或者全部数据都取完。
[解决办法]
这样:
#include <stdio.h>// 顺时针打印void clock_print(int arr[][4], int row_max, int col_max){ int i; int r; // 当前处理行 int c; // 当前处理列 int top; // 旋转后的厚度:顶 int bottom; // 旋转后的厚度:底 int left; // 旋转后的厚度:左边界 int right; // 旋转后的厚度:右边界 int dir; // 方向:0 1 2 3 -> 右 下 左 上(顺时针) dir = 0; top = 0; bottom = 0; left = 0; right = 0; c = 0; r = 0; i = row_max * col_max; printf("%d ", arr[r][c]); while (true) { // 若所有元素处理完毕,就结束循环 if (i < 2) break; switch(dir) { case 0: // 右行 if (c >= (col_max - right - 1)) { dir = (dir + 1) % 4; ++top; continue; } ++c; break; case 1: // 下行 if (r >= (row_max - bottom - 1)) { dir = (dir + 1) % 4; ++right; continue; } ++r; break; case 2: // 左行 if (c <= left) { dir = (dir + 1) % 4; ++bottom; continue; } --c; break; case 3: // 上行 if (r <= top) { dir = (dir + 1) % 4; ++left; continue; } --r; break; }; // end switch --i; printf("%d ", arr[r][c]); } // end while}void main(void){ int arr[4][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; clock_print(arr, 4, 4);}
[解决办法]
要几阶就几阶嘛,把 4 改 50 呗,我这个是全球通用的, 不分奇偶阶:
void clock_print(int arr[][50], int row_max, int col_max)...void main(void){ int arr[99999][50] = {……}; clock_print(arr, 99999, 50); }