顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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.
思路:打印第一行,然后删除第一行,逆时针旋转。循环终止到数组中没有元素。
class Solution { void ccwVector(vector<vector<int> >&a){ vector<vector<int>>b = a; if (a.size() <= 0) return; //初始化矩阵的空间 a.clear(); a.resize(b[0].size()); for (int i = 0; i < a.size(); i++){ a[i].resize(b.size()); } //制作逆时针转向的新矩阵 for (int i = 0; i < b[0].size(); i++){ for (int j = 0; j < b.size(); j++){ a[b[0].size() - i - 1][j] = b[j][i]; } } } public: vector<int> printMatrix(vector<vector<int> > matrix) { vector<int>result; vector<vector<int>>::iterator i; while (matrix.size()>0){ i = matrix.begin(); for (auto j = (*i).begin(); j!=(*i).end(); j++){ result.push_back(*j); } matrix.erase(matrix.begin()); ccwVector(matrix); } return result; } }; int main(){ Solution s; vector<vector<int>>a(4, vector < int>(4)); int v = 1; //初始化一个矩阵。 for (int i = 0; i < a.size(); i++){ for (int j = 0; j < a[0].size(); j++){ a[i][j] = v++; cout << a[i][j] <<" "; } cout << endl; } cout << "-----------" << endl; vector<int>b = s.printMatrix(a); for (int i = 0; i < b.size(); i++){ cout<<b[i]<<" " ; } cout << endl; }
//这里先a[i][j] = b[j][i]; 发现a中的数组是反的,所以有了下面的代码。
a[b[0].size() - i - 1][j] = b[j][i];
细心一点就可以了,这里是有规律的,所有一定能找到循环赋值的方法。