1391---顺时针打印矩阵
- 题目描述:
-
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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
#include<iostream> using namespace std; int a[1001][1001]; int main() { int m,n,i,j; int startX,startY,endX,endY; while(cin>>m>>n) { startX=0,startY=0,endX=m-1,endY=n-1; for(i=startX;i<=endX;i++) for(j=startY;j<=endY;j++) cin>>a[i][j]; while((startX<=endX)&&(startY<=endY)) { for(i=startY;i<=endY;i++) cout<<a[startX][i]<<' '; for(i=startX+1;i<=endX;i++) cout<<a[i][endY]<<' '; for(i=endY-1;i>=startY && startX!=endX;i--) cout<<a[endX][i]<<' '; for(i=endX-1;i>startX && startY!=endY;i--) cout<<a[i][startY]<<' '; startX++; startY++; endX--; endY--; } cout<<endl; } return 0; }解题思路:主要的思想是:采用一层一层的剥离输出。
(startX,startY) ,(endX,endY) 分别对应矩阵左上角和右下角 点的坐标; 通过一层一层剥离输出;每剥一层就将 startX++,startY++,endX--,endY--; 直到最后将矩阵元素全部输出,即满足(startX>endX 或者 startY>endY)[不满足(startX<=endX && startY<=endY)]
同时要考虑 最后一次时,只有一个元素; 只有一行元素;只有一列元素;有一圈元素
浙公网安备 33010602011771号