/** * Return an array of arrays. * Note: The returned array must be malloced, assume caller calls free(). */ int** generateMatrix(int n) { int **matrix = malloc(sizeof(int *) * n); int offset = 0; int maxOffset = n / 2 + 1; int index = 1; int i; for(i = 0; i < n; i++) *(matrix + i) = malloc(sizeof(int) * n); for(offset = 0; offset < maxOffset; offset++, n -= 2) { if(n == 0) break; else if(n == 1) { matrix[offset][offset] = index++; break; } else { for(i = 0; i < n; i++) matrix[offset][offset + i] = index++; for(i = 1; i < n; i++) matrix[offset + i][offset + n - 1] = index++; for(i = 1; i < n; i++) matrix[offset + n - 1][offset + n - 1 - i] = index++; for(i = 1; i < n - 1; i++) matrix[offset + n - 1 - i][offset] = index++; } } return matrix; }