剑指Offer - 九度1391 - 顺时针打印矩阵

剑指Offer - 九度1391 - 顺时针打印矩阵
2013-11-24 04:55
题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:

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.

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列。

接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1<=a<=10000)。

输出:

对应每个测试案例,输出一行,

按照从外向里以顺时针的顺序依次打印出每一个数字,每个数字后面都有一个空格。

样例输入:
4 4

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 
题意分析:
  很无聊但很考验细心程度的一道题。一圈一圈地往里打印,注意循环方向,注意下标别多1或者少1。一次ac还是有难度的。
  时间复杂度O(m * n),空间复杂度O(1)。
 1 // 652496    zhuli19901106    1391    Accepted    点击此处查看所有case的执行结果    4968KB    961B    520MS

 2 // 201311170129

 3 #include <cstdio>

 4 using namespace std;

 5 

 6 int m, n;

 7 const int MAXN = 1005;

 8 int a[MAXN][MAXN];

 9 

10 int main()

11 {

12     int i, j;

13     

14     while(scanf("%d%d", &m, &n) == 2){

15         if(m <= 0 || n <= 0){

16             continue;

17         }

18         for(i = 0; i < m; ++i){

19             for(j = 0; j < n; ++j){

20                 scanf("%d", &a[i][j]);

21             }

22         }

23         

24         for(i = 0; (i <= m - 1 - i) && (i <= n - 1 - i); ++i){

25             for(j = i; j <= n - 1 - i; ++j){

26                 printf("%d ", a[i][j]);

27             }

28             if(i + 1 <= m - 1 - i - 1){

29                 for(j = i + 1; j <= m - 1 - i - 1; ++j){

30                     printf("%d ", a[j][n - 1 - i]);

31                 }

32             }

33             if(i < m - 1 - i){

34                 for(j = n - 1 - i; j >= i; --j){

35                     printf("%d ", a[m - 1 - i][j]);

36                 }

37             }

38             if(i + 1 <= m - 1 - i && i < n - 1 - i){

39                 for(j = m - 1 - i - 1; j >= i + 1; --j){

40                     printf("%d ", a[j][i]);

41                 }

42             }

43         }

44         printf("\n");

45     }

46     

47     return 0;

48 }

 

你可能感兴趣的:(打印)