public class Solution {
public enum Direction{
right,
down,
left,
up
};
public int[] SpiralOrder(int[][] matrix) {
Direction dir = Direction.right;
int height = matrix.Length;
if(height == 0){
return new int[]{};
}
int width = matrix[0].Length;
int[] ret = new int[height * width];
int index = 0;
int i = 0;
int j = 0;
ret[index++] = matrix[i][j];
matrix[i][j] = int.MinValue;
bool isFinish = false;
do{
switch(dir){
case Direction.right:{
if(j+1 == width || matrix[i][j+1] == int.MinValue){
if(i+1 == height || matrix[i+1][j] == int.MinValue){
isFinish = true;
break;
}
dir = Direction.down;
i++;
}
else{
j++;
}
break;
}
case Direction.down:{
if(i+1 == height || matrix[i+1][j] == int.MinValue){
if(j - 1 == -1 || matrix[i][j - 1] == int.MinValue){
isFinish = true;
break;
}
dir = Direction.left;
j--;
}
else{
i++;
}
break;
}
case Direction.left:{
if(j - 1 == -1 || matrix[i][j - 1] == int.MinValue){
if(i - 1 == -1 || matrix[i - 1][j] == int.MinValue){
isFinish = true;
break;
}
dir = Direction.up;
i--;
}
else{
j--;
}
break;
}
case Direction.up:{
if(i - 1 == -1 || matrix[i - 1][j] == int.MinValue){
if(j + 1 == height || matrix[i][j + 1] == int.MinValue){
isFinish = true;
break;
}
dir = Direction.right;
j++;
}
else{
i--;
}
break;
}
}
if(index == ret.Length){
break;
}
else{
ret[index++] = matrix[i][j];
matrix[i][j] = int.MinValue;
}
}while(!isFinish);
return ret;
}
}