双百答案
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector <int> res;
if (matrix.empty()) return res;
int rl=0, rh=matrix.size()-1;//rl上,rh下
int cl=0, ch=matrix[0].size()-1;//cl左, ch右
while(1){
for(int i=cl;i<=ch;i++) res.push_back(matrix[rl][i]);
if(++rl>rh)break;
for(int i=rl;i<=rh;i++) res.push_back(matrix[i][ch]);
if(--ch<cl)break;
for(int i=ch;i>=cl;i--) res.push_back(matrix[rh][i]);
if(--rh<rl)break;
for(int i=rh;i>=rl;i--) res.push_back(matrix[i][cl]);
if(++cl>ch)break;
}
return res;
}
};
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector< vector<int> > res(n,vector<int>(n, 0));
if(n==0) return {{}};
int up=0, down=n-1;
int l=0, r=n-1;
int num=0;
while(l<=r&&up<=down){
for(int i=l;i<=r;i++) res[up][i]=++num;
if(++up>down) break;
for(int i=up;i<=down;i++) res[i][r]=++num;
if(--r<l) break;
for(int i=r;i>=l;i--) res[down][i]=++num;
if(--down<up) break;
for(int i=down;i>=up;i--) res[i][l]=++num;
if(++l>r)break;
}
return res;
}
};
class Solution {
public:
vector<vector<int>> spiralMatrixIII(int R, int C, int r0, int c0) {
vector<vector<int> > res;
int l=c0, r=c0, up=r0, down=r0;
while(l>=0||r<C||up>=0||down<R){
if(r<C)
for(int i=max(up+1, 0);i<min(down,R);i++)
res.push_back({i, r});
if(down<R)
for(int i=min(C-1, r);i>=max(0, l);i--)
res.push_back({down, i});
if(l>=0&&r>l)
for(int i=min(R-1, down-1); i>=max(0, up+1); i--)
res.push_back({i,l});
if(down>up&&up>=0)
for(int i=max(0, l);i<=min(C-1, r);i++)
res.push_back({up, i});
up--;
down++;
l--;
r++;
}
// while(1){
// for(int i=max(l, 0);i<=min(r, C);i++)res.push_back({up,i});
// if(++up>down) break;
// for(int i=max(up, 0);i<=min(down, R);i++)res.push_back({i, r});
// if(--r<l)break;
// for(int i=min(r, C);i>=max(l, 0);i--)res.push_back({down,i});
// if(--down<up)break;
// for(int i=min(R, down);i>=max(up,0);i--)res.push_back({i, l});
// if(++l>r)break;
// }
return res;
}
};