/*
* (C#)打印蛇形正方形矩阵, 如:
* 1 2 3
* 8 9 4
* 7 6 5
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
enum Direction
{
right, down, left, up
}
public static int[][] GetSnakeMatrix(int rank)
{
int[][] array = AssignArray(rank);
int dir = 0;
int row = 0, colomn = 0;
int num = rank * rank;
for (int i = 1; i <= num; )
{
if (colomn >= rank)
colomn--;
if (colomn < 0)
colomn++;
if (row >= rank)
row--;
if (row < 0)
row++;
if (array[row][colomn] == 0)
array[row][colomn] = i++;
else
{
if (array[row][colomn] != i - 1)
{
switch (dir)
{
default:
case (int)Direction.up:
row++;
break;
case (int)Direction.right:
colomn--;
break;
case (int)Direction.down:
row--;
break;
case (int)Direction.left:
colomn++;
break;
}
}
dir++;
if (dir > (int)Direction.up)
dir = (int)Direction.right;
}
switch (dir)
{
default:
case (int)Direction.right:
colomn++;
break;
case (int)Direction.down:
row++;
break;
case (int)Direction.left:
colomn--;
break;
case (int)Direction.up:
row--;
break;
}
}
return array;
}
public static int[][] AssignArray(int rank)
{
int[][] array = new int[rank][];
for (int i = 0; i < rank; i++)
{
int[] tmpArr = new int[rank];
array[i] = tmpArr;
}
return array;
}
public static void PrintArray(int[][] array)
{
for (int i = 0; i < array.Length; i++)
{
for (int j = 0; j < array[i].Length; j++)
{
Console.Write("{0, 3}", array[i][j]);
}
Console.WriteLine();
}
}
static void Main(string[] args)
{
PrintArray(GetSnakeMatrix(1));
Console.WriteLine();
PrintArray(GetSnakeMatrix(2));
Console.WriteLine();
PrintArray(GetSnakeMatrix(3));
Console.WriteLine();
PrintArray(GetSnakeMatrix(8));
Console.WriteLine();
PrintArray(GetSnakeMatrix(9));
Console.WriteLine();
PrintArray(GetSnakeMatrix(10));
Console.WriteLine();
}
}
}
/*optimized GetSnakeMatrix(int rank){}
public static int[][] GetSnakeMatrix(int rank)
{
int[][] array = AssignArray(rank);
int dir = 0;
int row =0, colomn = 0;
int num = rank * rank;
for (int i = 1; i <= num; )
{
if (array[row][colomn] == 0)
array[row][colomn] = i++;
else
{
dir++;
if (dir > (int)Direction.up)
dir = (int)Direction.right;
}
switch (dir)
{
default:
case (int)Direction.right:
if (array[row][colomn] != i - 1)
row++;
if (colomn < rank - 1)
colomn++;
break;
case (int)Direction.down:
if (array[row][colomn] != i - 1)
colomn--;
if (row < rank - 1)
row++;
break;
case (int)Direction.left:
if (array[row][colomn] != i - 1)
row--;
if (colomn > 0)
colomn--;
break;
case (int)Direction.up:
if (array[row][colomn] != i - 1)
colomn++;
if (row > 0)
row--;
break;
}
}
return array;
}
*/