代码
1 class ScremNumbers
2 {
3 enum Direction { Right, Down, Left, Up }
4
5 [System.Diagnostics.DebuggerDisplay("({X},{Y})")]
6 struct Point
7 {
8 public int X;
9 public int Y;
10 }
11
12 public int Count { get; private set; }
13
14 int[,] numbers;
15 public ScremNumbers(int count)
16 {
17 this.Count = count;
18 numbers = new int[count, count];
19
20 Process();
21 }
22
23 void Process()
24 {
25 var point = new Point();
26 var direction = Direction.Right;
27
28 for (int i = 0; i < Count * Count; i++)
29 {
30 var nextPoint = NextPoint(point, direction);
31 if (this[nextPoint] != 0)
32 {
33 direction = NextDirection(direction);
34 nextPoint = NextPoint(point, direction);
35 }
36
37 this[point] = i + 1;
38 point = nextPoint;
39 }
40 }
41
42 public void Print()
43 {
44 var maxLength = (Count * Count).ToString().Length + 1;
45
46 for (int i = 0; i < Count; i++)
47 {
48 for (int j = 0; j < Count; j++)
49 {
50 Console.Write(numbers[j, i].ToString().PadRight(4));
51 }
52 Console.WriteLine();
53 }
54 }
55
56 Point NextPoint(Point point, Direction direction)
57 {
58 var nextPoint = point;
59 switch (direction)
60 {
61 case Direction.Right:
62 nextPoint.X++;
63 break;
64 case Direction.Down:
65 nextPoint.Y++;
66 break;
67 case Direction.Left:
68 nextPoint.X--;
69 break;
70 case Direction.Up:
71 nextPoint.Y--;
72 break;
73 default:
74 throw new InvalidOperationException();
75 }
76
77 return nextPoint;
78 }
79
80 Direction NextDirection(Direction direction)
81 {
82 return (Direction)(((int)direction + 1) % 4);
83 }
84
85 private int this[Point index]
86 {
87 get
88 {
89 if (index.X < 0 || index.X >= Count || index.Y < 0 || index.Y >= Count)
90 return -1;
91
92 return numbers[index.X, index.Y];
93 }
94
95 set { numbers[index.X, index.Y] = value; }
96 }
97 }
程序用的算法比较简单,是一种最直接的算法:不停的往前走,碰壁便转弯。总体感觉整体思路还比较清晰,这里记录一下。