万事开头难
处理好每一轮的起始位置和终止位置
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
//初始化返回结果数组ans
*returnSize = n;
*returnColumnSizes = (int*)malloc(sizeof(int)*n);
int **ans = (int**)malloc(sizeof(int*)*n);
int i,j;
for(i = 0;i < n; i++){
ans[i] = (int*)malloc(sizeof(int)*n);
(*returnColumnSizes)[i] = n;
}
//定义起始位置
int startX = 0;
int startY = 0;
//定义循环圈数
int loop = n / 2;
//针对奇数
int mid = n / 2;
//定义每一圈的偏移量
int offest = 1;
//要填入的数
int count = 1;
while(loop){
int i = startX;
int j = startY; //起始位置跟着变
//上侧从左往右
for(;j < n - offest;j++)
ans[startX][j] = count++;
//右侧从上往下
for(;i< n - offest;i++)
ans[i][j] = count++;
//下侧从右往左
for(;j > startY;j--)
ans[i][j] = count++;
//左侧从下往上
for(;i > startX;i--)
ans[i][j] = count++;
offest += 1;
loop--;
startX++;
startY++;
}
if(n % 2)
ans[mid][mid] = count;
return ans;
}