http://blog.csdn.net/shiquxinkong
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
我们按着要求去走一圈,就像剥橘子一样,我们把上下左右的皮都剥掉了,那么这圈就可以了,只不过这里拨了一层还的拨。好了,看图:
其中颜色一样的表示在同一层,红色表示每层的起始点,这个实例共有三层,按着前面说的,在拨的时候就按上右下左的顺序去拨,上有老下有小左右兄弟右有姐妹。
那么我需要拨几层呢?上面的三层是我们用眼睛盯出来了,对,应该是 (n + 1)/ 2.
//CODE
class Solution { public: vector<vector<int> > generateMatrix(int n) { vector<vector<int> > vivec(n,vector<int>(n, 0)); if(n <= 0) return vivec; int start_num = 1; //up,right,down and left construct a circle. int layer = 0; while(layer < (1+n)/2) { //up for(int i = layer; i < n - layer; ++i) { vivec[layer][i] = start_num++; } //right for(int i = layer + 1; i < n - layer; ++i) { vivec[i][n - layer - 1] = start_num++; } //down for(int i = n - layer - 2; i >= layer; --i) { vivec[n - layer - 1][i] = start_num++; } //left for(int i = n - layer - 2; i >= layer + 1; --i) { vivec[i][layer] = start_num++; } layer++; } return vivec; } };注意控制每一层的起始边界。