题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 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.

分析:顺着走,即向右->向下->向左->向上,一共要走(长*宽)步。遇到边界就改变方向,当向上碰到顶的时候,四个边界都缩小。
 

vector<int> printMatrix(vector<vector<int>>& matrix) {
 
 
	vector<int> ret;
	if (matrix.empty())
		return ret;
 
 
	int rows = matrix.size();
	int cols = matrix[0].size();
	int elem = rows * cols;
 
	//用来遍历行、列
	int x = 0;
	int y = 0;
 
	//记录当前行、列的最大边界
	int row_max = rows - 1;
	int col_max = cols - 1;
 
	//记录当前所在的行、列
	int row_cur = 0;
	int col_cur = 0;
 
 
	while (elem-->0)
	{
		//先将当前元素尾插到ret数组中
		ret.push_back(matrix[x][y]);
 
		//往左走,走到边界停止,并且往下移动一行
		if (x == row_cur)
		{
			if (y < col_max)//当前行的列没走完,继续
			{
				y++;
			}
			else if(y== col_max) //当前列走完了,则列不变,移向下一行
			{
				x++;
			}
			continue;
		}
 
		//往下走
		if (y == col_max)
		{
			if (x < row_max)//当前列的行还没走完,继续
			{
				x++;
			}
			else if(x == row_max)//当前列的行走完了,移向前一列
			{
				y--;
			}
			continue;
 
		}
 
		//往左走
		if (x == row_max)
		{
			if (y > col_cur)//当前行的列没走完,继续
			{
				y--;
			}
			else if(y == col_cur)//当前行的列走完了,移向上一行
			{
				x--;
			}
			continue;
 
		}
 
		//往上走
		if (y == col_cur)
		{
			if (x > row_cur + 1)//当前列的行没走完,继续
			{
				x--;
			}
			else if(x == row_cur + 1)//向上碰到顶了,说明一圈走完了,那么将边界都缩小一圈,并且记录当前行列各增加1
			{
				y++;
				row_max--;
				col_max--;
 
				row_cur++;
				col_cur++;
			}
			continue;
 
		}
	}
	return ret;
}