剑指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(" "); 45 } 46 47 return 0; 48 }