题目
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
分析
此为2016年3月28日阿里内推笔试第三题. 使用两个二维数组matrix
和visited
分别保存需要返回的信息以及某一位置是否被访问过. 从 (0, 0) 开始依次向右, 下, 左, 上移动, 对matrix
赋值同时修改visited
表示已经访问过该位置. 所有位置均访问过后退出循环, 释放内存, 同时返回结果.
解答
int** generateMatrix(int n) {
int **matrix = malloc(sizeof(int*) * n);
int **visited = malloc(sizeof(int*) * n);
for (int i = 0; i < n; i++) {
matrix[i] = malloc(sizeof(int) * n);
visited[i] = malloc(sizeof(int) * n);
memset(visited[i], 0, sizeof(int) * n);
}
int cnt = 1;
int total = n * n;
int r = 0, c = 0;
while (total) {
while (c < n && !visited[r][c]) {
matrix[r][c] = cnt++;
visited[r][c] = 1;
total--; c++;
}
// move back one column, and step to next row
// similar situations below
c--; r++;
while (r < n && !visited[r][c]) {
matrix[r][c] = cnt++;
visited[r][c] = 1;
total--; r++;
}
r--; c--;
while (c >= 0 && !visited[r][c]) {
matrix[r][c] = cnt++;
visited[r][c] = 1;
total--; c--;
}
c++; r--;
while (r >= 0 && !visited[r][c]) {
matrix[r][c] = cnt++;
visited[r][c] = 1;
total--; r--;
}
r++; c++;
}
// Don't forget to free you memory, or there would be a
// memory leak
for (int i = 0; i < n; i++)
free(visited[i]);
free(visited);
return matrix;
}