题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
解析:
主要考查逻辑性,对各种边界条件的判断。
一共有四种情况:
- 矩阵有多行多列
- 矩阵为一行多列
- 矩阵为多行一列
- 矩阵为一行一列,即只有一个元素
打印时,矩阵从外层向里层逐步缩进,每层可分为四步进行,从左上至右上、从右上至右下、从右下至左下、从左下至左上,一定要思考清楚每一步完成后,进入到下一步的条件。
#include<bits/stdc++.h>
using namespace std;
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> ans;
int x = 0, y = 0, up = 0, left = 0, down = (int)matrix.size() - 1, right = (int)matrix[0].size() - 1;
for (; up <= down && left <= right; up++, down--, left++, right--){
//从左上至右上
for (y = left, x = up; y <= right; ans.push_back(matrix[x][y]), y++){};
//从右上至右下
if (up+1<=down)
for (y = right, x = up + 1; x <= down; ans.push_back(matrix[x][y]), x++){};
//从右下至左下
if (right-1>=left&&up<down) //只有一行的情况需要加上up<down的判断
for (y = right - 1, x = down; y >= left; ans.push_back(matrix[x][y]), y--){};
//从左下至右上
if (down-1>up&&left<right) //只有一列的情况需要加上left<right的判断
for (y = left, x = down - 1; x >= up + 1; ans.push_back(matrix[x][y]), x--){};
}
for (int i = 0; i < (int)ans.size(); printf("%d ", ans[i]), i++){}
return ans;
}
void Test(int columns, int rows)
{
printf("Test Begin: %d columns, %d rows.\n", columns, rows);
if (columns < 1 || rows < 1)
return;
vector<vector<int> > matrix(rows, vector<int>(columns));//rows*columns的二维向量
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < columns; ++j)
{
matrix[i][j] = i * columns + j + 1;
}
}
printMatrix(matrix);
printf("\n");
matrix.clear();
}
int main(int argc, char* argv[])
{
/*
1
*/
Test(1, 1);
/*
1 2
3 4
*/
Test(2, 2);
/*
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
*/
Test(4, 4);
/*
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
*/
Test(5, 5);
/*
1
2
3
4
5
*/
Test(1, 5);
/*
1 2
3 4
5 6
7 8
9 10
*/
Test(2, 5);
/*
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
*/
Test(3, 5);
/*
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
*/
Test(4, 5);
/*
1 2 3 4 5
*/
Test(5, 1);
/*
1 2 3 4 5
6 7 8 9 10
*/
Test(5, 2);
/*
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
*/
Test(5, 3);
/*
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
*/
Test(5, 4);
system("pause");
return 0;
}