逆时针或顺时针输出循环数字(CSharp)
- class Test2
- {
- #region 题目:
- /*
- * 根据给定的整数,输出如下所示图形
- * 以1为中心,顺时针 或逆时针 旋转 输出!
- *
- *
- * 7 8 9
- * 6 1 2
- * 5 4 3
- * --例子1
- *
- *
- * 2 1 2 2 2 3 2 4 2 5
- *
- * 2 0 7 8 9 1 0
- *
- * 1 9 6 1 2 1 1
- *
- * 1 8 5 4 3 1 2
- *
- * 1 7 1 6 1 5 1 4 1 3
- * --例子2
- */
- #endregion
- /// <summary>
- /// 生成二维数组 ,注意:参数i为奇数!
- /// </summary>
- /// <param name="i">要输出的行数</param>
- /// <param name="InitialDirection">旋转的初始方向(【上,右,下,左】)</param>
- /// <param name="clock">逆时针或顺时针</param>
- /// <returns></returns>
- int[][] GetArray(int i, Direction InitialDirection, Clock clock)
- {
- int[][] a = new int[i][];
- for (int j = 0; j < a.Length; j++)
- {
- a[j] = new int[i];
- }
- //
- int m = i / 2; int n = i / 2;
- //最中间的元素为1
- a[m][n] = 1;
- Direction direction = InitialDirection;
- for (int k = 2; k <= i * i; k++)
- {
- if (k == 2)
- {
- switch (direction)
- {
- case Direction.top:
- a[--m][n] = k;
- break;
- case Direction.right:
- a[m][++n] = k;
- break;
- case Direction.bottom:
- a[++m][n] = k;
- break;
- case Direction.left:
- a[m][--n] = k;
- break;
- default:
- break;
- }
- continue;
- }
- switch (clock)
- {
- case Clock.clockwise:
- //顺时针
- /* 在【顺时针】情况下,
- * 当移动方向direction 为right时,试着让移动方向朝bottom转移:
- * 把当前数组a[m][n]元素的坐标向下移动一位,如果新生成的数组元素a[++m][n]值为0,说明可以转移方向,
- * 则把k值赋给 新数组元素,direction变为bottom;
- * 否则,****原数组元素a[m][n]**** 坐标
- * 向右移动一位生成新数组元素,并把k值赋给新数组元素!
- * 其余方向转移,类似于right 到bottom,如bottom到left,left到top,top到right。
- */
- switch (direction)
- {
- case Direction.top:
- if (a[m][++n] == 0)
- {
- a[m][n] = k;
- direction = Direction.right;
- }
- else
- {
- n--;
- a[--m][n] = k;
- }
- break;
- case Direction.right:
- if (a[++m][n] == 0)
- {
- a[m][n] = k;
- direction = Direction.bottom;
- }
- else
- {
- m--;
- a[m][++n] = k;
- }
- break;
- case Direction.bottom:
- if (a[m][--n] == 0)
- {
- a[m][n] = k;
- direction = Direction.left;
- }
- else
- {
- n++;
- a[++m][n] = k;
- }
- break;
- case Direction.left:
- if (a[--m][n] == 0)
- {
- a[m][n] = k;
- direction = Direction.top;
- }
- else
- {
- m++;
- a[m][--n] = k;
- }
- break;
- default:
- break;
- }
- break;
- case Clock.anticlockwise:
- //逆时针
- /* 在【逆时针】情况下,
- * 当移动方向direction 为right时,试着让移动方向朝top转移:
- * 把当前数组a[m][n]元素的坐标向上移动一位,如果新生成的数组元素a[--m][n]值为0,说明可以转移方向,
- * 则把k值赋给 新数组元素,direction变为top;
- * 否则,****原数组元素a[m][n]**** 坐标
- * 向右移动一位生成新数组元素,并把k值赋给新数组元素!
- * 其余方向转移,类似于right 到top,如bottom到right,left到bottom,top到left。
- */
- switch (direction)
- {
- case Direction.top:
- if (a[m][--n] == 0)
- {
- a[m][n] = k;
- direction = Direction.left;
- }
- else
- {
- n++;
- a[--m][n] = k;
- }
- break;
- case Direction.right:
- if (a[--m][n] == 0)
- {
- a[m][n] = k;
- direction = Direction.top;
- }
- else
- {
- m++;
- a[m][++n] = k;
- }
- break;
- case Direction.bottom:
- if (a[m][++n] == 0)
- {
- a[m][n] = k;
- direction = Direction.right;
- }
- else
- {
- n--;
- a[++m][n] = k;
- }
- break;
- case Direction.left:
- if (a[++m][n] == 0)
- {
- a[m][n] = k;
- direction = Direction.bottom;
- }
- else
- {
- m--;
- a[m][--n] = k;
- }
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
- return a;
- }
- /// <summary>
- /// 控制台界面 上,输出二维数组
- /// </summary>
- /// <param name="i"></param>
- internal void Printf(int i, Direction inaitialDirection, Clock clock)
- {
- if (i % 2 == 0)
- {
- i++;
- }
- int[][] a = GetArray(i, inaitialDirection, clock);
- for (int j = 0; j < a.Length; j++)
- {
- Console.Write(" ");
- for (int k = 0; k < a.Length; k++)
- {
- Console.Write(PrintFormat(a[j][k]));
- }
- Console.WriteLine("\r\n\r\n");
- }
- }
- /// <summary>
- /// 格式化输出数字格式化,以便对齐
- /// </summary>
- /// <param name="m"></param>
- /// <returns></returns>
- String PrintFormat(int m)
- {
- string s = m.ToString();
- if (s.Length == 1)
- {
- return " " + m + " " + " " + " ";
- }
- else if (s.Length == 2)
- {
- return s.Substring(0, 1) + " " + s.Substring(1, 1) + " " + " ";
- }
- else
- {
- return s + " " + " ";
- }
- }
- }
- /// <summary>
- /// 定义枚举,上,右,下,左4个方向。
- /// </summary>
- enum Direction
- { top, right, bottom, left }
- /// <summary>
- /// 逆时针或顺指针
- /// </summary>
- enum Clock
- { clockwise, anticlockwise }
//调用方法。
- static void Main(string[] args)
- {
- Test2 test = new Test2();
- Console.WriteLine("\r\n");
- test.Printf(9, Direction.right, Clock.clockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- test.Printf(9, Direction.right, Clock.anticlockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- test.Printf(9, Direction.bottom, Clock.clockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- test.Printf(9, Direction.bottom, Clock.anticlockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- test.Printf(9, Direction.left, Clock.clockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- test.Printf(9, Direction.left, Clock.anticlockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- test.Printf(9, Direction.top, Clock.clockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- test.Printf(9, Direction.top, Clock.anticlockwise);
- Console.WriteLine("\r\n---------\r\n------------------\r\n");
- }
转载于:https://blog.51cto.com/luoqibc221/426666