Spiral_Matrix.png
#define DIR_RIGHT 0
#define DIR_DOWN 1
#define DIR_LEFT 2
#define DIR_UP 3
void next(int *i, int *j, int *dir, int *right_barr, int *bottom_barr, int *left_barr, int *top_barr) {
if (*dir == DIR_RIGHT) {
if (*j == *right_barr) {
(*right_barr)--;
(*i)++;
*dir = DIR_DOWN;
} else {
(*j)++;
}
} else if (*dir == DIR_DOWN) {
if (*i == *bottom_barr) {
(*bottom_barr)--;
(*j)--;
*dir = DIR_LEFT;
} else {
(*i)++;
}
} else if (*dir == DIR_LEFT) {
if (*j == *left_barr) {
(*left_barr)++;
(*i)--;
*dir = DIR_UP;
} else {
(*j)--;
}
} else if (*dir == DIR_UP) {
if (*i == (*top_barr)) {
(*top_barr)++;
(*j)++;
*dir = DIR_RIGHT;
} else {
(*i)--;
}
}
}
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
int right_barr = *matrixColSize - 1, bottom_barr = matrixSize - 1, left_barr = 0, top_barr = 1;
int *ret = (int*)malloc(matrixSize * *matrixColSize * sizeof(*ret));
int i = 0, j = 0, dir = 0, totalSize = matrixSize * *matrixColSize;
*returnSize = 0;
while (*returnSize < totalSize) {
ret[(*returnSize)++] = matrix[i][j];
next(&i, &j, &dir, &right_barr, &bottom_barr, &left_barr, &top_barr);
}
return ret;
}
网友评论