看到博客园上有人发这个程序的练习,便自己也写了一个。


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 }
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 }
程序用的算法比较简单,是一种最直接的算法:不停的往前走,碰壁便转弯。总体感觉整体思路还比较清晰,这里记录一下。