public class Solution
{
public IList<int> SpiralOrder(int[][] arr)
{
var ls = new List<int>();
var count = 0;
var bol = new bool[arr.Length, arr[0].Length];
int x = 0;
int y = 0;
var r = 0;
while (count < arr.Length * arr[0].Length)
{
// horizontally right
for (int i = 0; i < arr[0].Length - r; i++)
{
if (x < arr[0].Length - r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y][x++]);
count++;
}
}
y++;
x--;
// vertically down
for (int i = 0; i < arr.Length - r; i++)
{
if (y < arr.Length - r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y++][x]);
count++;
}
}
x--;
y--;
// horizontally left
for (int i = 0; i < arr[0].Length - r; i++)
{
if (x >= r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y][x--]);
count++;
}
}
x++;
y--;
// vertically Up
for (int i = 0; i < arr.Length - r; i++)
{
if (y > r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y--][x]);
count++;
}
}
x++;
y++;
r++;
}
return ls;
}
}