class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
int dir[][2] = {{0,1}, {1,0}, {0,-1}, {-1,0}};
vector<vector<int> > mat;
mat.resize(n);
for(int i = 0; i < n; ++i) {
mat[i].resize(n);
}
int d = 0, num = 1, r = 0, c = 0, step = n;
bool dstep = true;
while (num <= n * n) {
for (int i = 0; i < step; ++i) {
mat[r][c] = num++;
r += dir[d][0];
c += dir[d][1];
}
r -= dir[d][0];
c -= dir[d][1];
d = (d + 1) % 4;
r += dir[d][0];
c += dir[d][1];
if (dstep) {
step--;
}
dstep = !dstep;
}
return mat;
}
};