https://leetcode.com/problems/spiral-matrix/
水题做成这个样子真是说不过去,,
四个变量控制,两个控制左右范围,另个控制上下范围
两种特殊情况,只有一行和一列,因为push_back的时候其实只是考虑了行或者列的情况没有综合考虑 所以容易重复
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
class Solution {
public:
vector<int> spiralOrder( vector<vector<int> >& matrix) {
vector <int> ret;
if(matrix.size() == 0)
return ret;
if(matrix.size() == 1)return matrix[0];
int left = 0, right = matrix[0].size(),hang=matrix.size(), h0=0;
while(ret.size() < matrix.size()*matrix[0].size()) {
//up
for(int i=left;i<right;i++)
ret.push_back(matrix[h0][i]);
if(ret.size() >= matrix.size()*matrix[0].size() ) break;
//right
for(int i=h0+1;i<hang;i++)
ret.push_back(matrix[i][right-1]);
if(ret.size() >= matrix.size()*matrix[0].size() ) break;
//down
for(int i=right-2;i>=left;i--)
ret.push_back(matrix[hang-1][i]);
if(ret.size() >= matrix.size()*matrix[0].size() ) break;
//left
for(int i=hang-2;i>h0;i--)
ret.push_back(matrix[i][left]);
left ++;
right --;
hang --;
h0++;
}
return ret;
}
};
int main() {
//freopen("54.txt", "r", stdin);
int n,m, in;
while(cin >> n >> m ){
vector < vector<int> > mx;
for(int i=0;i<n;i++) {
vector <int> ivec;
for(int j=0;j<m;j++) {
cin >> in;
ivec.push_back(in);
}
mx.push_back(ivec);
}
Solution s;
vector <int> ans = s.spiralOrder(mx);
for(int i=0;i<ans.size();i++)
cout << ans[i] << ", ";
cout << endl;
}
return 0;
}