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)]

  同时要考虑 最后一次时,只有一个元素; 只有一行元素;只有一列元素;有一圈元素

 

posted @ 2014-12-30 11:13  zhoudan  阅读(144)  评论(0)    收藏  举报