剑指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 }

 

 posted on 2013-11-24 05:00  zhuli19901106  阅读(248)  评论(0编辑  收藏  举报