逆时针或顺时针输出循环数字(CSharp)

 









 


  
  1. class Test2 
  2.     #region 题目: 
  3.     /*   
  4.          * 根据给定的整数,输出如下所示图形   
  5.          * 以1为中心,顺时针 或逆时针 旋转 输出!   
  6.          *    
  7.          *             
  8.          *              7 8 9    
  9.          *              6 1 2   
  10.          *              5 4 3   
  11.          *              --例子1   
  12.          *    
  13.          *    
  14.          *          2 1   2 2   2 3   2 4   2 5    
  15.          *    
  16.          *          2 0    7     8     9    1 0   
  17.          *    
  18.          *          1 9    6     1     2    1 1   
  19.          *    
  20.          *          1 8    5     4     3    1 2   
  21.          *    
  22.          *          1 7   1 6   1 5   1 4   1 3   
  23.          *                  --例子2   
  24.          */ 
  25.     #endregion 
  26.  
  27.     /// <summary> 
  28.     /// 生成二维数组 ,注意:参数i为奇数! 
  29.     /// </summary> 
  30.     /// <param name="i">要输出的行数</param> 
  31.     /// <param name="InitialDirection">旋转的初始方向(【上,右,下,左】)</param> 
  32.     /// <param name="clock">逆时针或顺时针</param> 
  33.     /// <returns></returns> 
  34.     int[][] GetArray(int i, Direction InitialDirection, Clock clock) 
  35.     { 
  36.         int[][] a = new int[i][]; 
  37.         for (int j = 0; j < a.Length; j++) 
  38.         { 
  39.             a[j] = new int[i]; 
  40.         } 
  41.         //   
  42.         int m = i / 2; int n = i / 2; 
  43.         //最中间的元素为1   
  44.         a[m][n] = 1; 
  45.         Direction direction = InitialDirection; 
  46.         for (int k = 2; k <= i * i; k++) 
  47.         { 
  48.             if (k == 2) 
  49.             { 
  50.                 switch (direction) 
  51.                 { 
  52.                     case Direction.top: 
  53.                         a[--m][n] = k; 
  54.                         break
  55.                     case Direction.right: 
  56.                         a[m][++n] = k; 
  57.                         break
  58.                     case Direction.bottom: 
  59.                         a[++m][n] = k; 
  60.                         break
  61.                     case Direction.left: 
  62.                         a[m][--n] = k; 
  63.                         break
  64.                     default
  65.                         break
  66.                 } 
  67.                 continue
  68.             } 
  69.  
  70.  
  71.  
  72.  
  73.             switch (clock) 
  74.             { 
  75.                 case Clock.clockwise: 
  76.                     //顺时针 
  77.                     /* 在【顺时针】情况下, 
  78.                         * 当移动方向direction 为right时,试着让移动方向朝bottom转移: 
  79.                         * 把当前数组a[m][n]元素的坐标向下移动一位,如果新生成的数组元素a[++m][n]值为0,说明可以转移方向, 
  80.                         *  则把k值赋给  新数组元素,direction变为bottom;   
  81.                         * 否则,****原数组元素a[m][n]**** 坐标   
  82.                         * 向右移动一位生成新数组元素,并把k值赋给新数组元素!   
  83.                         * 其余方向转移,类似于right 到bottom,如bottom到left,left到top,top到right。 
  84.                         */ 
  85.                     switch (direction) 
  86.                     { 
  87.  
  88.                         case Direction.top: 
  89.                             if (a[m][++n] == 0) 
  90.                             { 
  91.                                 a[m][n] = k; 
  92.                                 direction = Direction.right; 
  93.                             } 
  94.                             else 
  95.                             { 
  96.                                 n--; 
  97.                                 a[--m][n] = k; 
  98.                             } 
  99.                             break
  100.                         case Direction.right: 
  101.                             if (a[++m][n] == 0) 
  102.                             { 
  103.                                 a[m][n] = k; 
  104.                                 direction = Direction.bottom; 
  105.                             } 
  106.                             else 
  107.                             { 
  108.                                 m--; 
  109.                                 a[m][++n] = k; 
  110.                             } 
  111.                             break
  112.                         case Direction.bottom: 
  113.                             if (a[m][--n] == 0) 
  114.                             { 
  115.                                 a[m][n] = k; 
  116.                                 direction = Direction.left; 
  117.                             } 
  118.                             else 
  119.                             { 
  120.                                 n++; 
  121.                                 a[++m][n] = k; 
  122.                             } 
  123.                             break
  124.                         case Direction.left: 
  125.  
  126.                             if (a[--m][n] == 0) 
  127.                             { 
  128.                                 a[m][n] = k; 
  129.                                 direction = Direction.top; 
  130.                             } 
  131.                             else 
  132.                             { 
  133.                                 m++; 
  134.                                 a[m][--n] = k; 
  135.                             } 
  136.                             break
  137.                         default
  138.                             break
  139.                     } 
  140.                     break
  141.                 case Clock.anticlockwise: 
  142.                     //逆时针 
  143.                     /* 在【逆时针】情况下, 
  144.                    * 当移动方向direction 为right时,试着让移动方向朝top转移: 
  145.                    * 把当前数组a[m][n]元素的坐标向上移动一位,如果新生成的数组元素a[--m][n]值为0,说明可以转移方向, 
  146.                    *  则把k值赋给  新数组元素,direction变为top;   
  147.                    * 否则,****原数组元素a[m][n]**** 坐标   
  148.                    * 向右移动一位生成新数组元素,并把k值赋给新数组元素!   
  149.                    * 其余方向转移,类似于right 到top,如bottom到right,left到bottom,top到left。 
  150.                    */ 
  151.                     switch (direction) 
  152.                     { 
  153.                         case Direction.top: 
  154.                             if (a[m][--n] == 0) 
  155.                             { 
  156.                                 a[m][n] = k; 
  157.                                 direction = Direction.left; 
  158.                             } 
  159.                             else 
  160.                             { 
  161.                                 n++; 
  162.                                 a[--m][n] = k; 
  163.                             } 
  164.                             break
  165.                         case Direction.right: 
  166.                             if (a[--m][n] == 0) 
  167.                             { 
  168.                                 a[m][n] = k; 
  169.                                 direction = Direction.top; 
  170.                             } 
  171.                             else 
  172.                             { 
  173.                                 m++; 
  174.                                 a[m][++n] = k; 
  175.                             } 
  176.                             break
  177.                         case Direction.bottom: 
  178.                             if (a[m][++n] == 0) 
  179.                             { 
  180.                                 a[m][n] = k; 
  181.                                 direction = Direction.right; 
  182.                             } 
  183.                             else 
  184.                             { 
  185.                                 n--; 
  186.                                 a[++m][n] = k; 
  187.                             } 
  188.                             break
  189.                         case Direction.left: 
  190.  
  191.                             if (a[++m][n] == 0) 
  192.                             { 
  193.                                 a[m][n] = k; 
  194.                                 direction = Direction.bottom; 
  195.                             } 
  196.                             else 
  197.                             { 
  198.                                 m--; 
  199.                                 a[m][--n] = k; 
  200.                             } 
  201.                             break
  202.                         default
  203.                             break
  204.                     } 
  205.                     break
  206.                 default
  207.                     break
  208.             } 
  209.  
  210.         } 
  211.  
  212.  
  213.  
  214.  
  215.         return a; 
  216.     } 
  217.  
  218.     /// <summary> 
  219.     /// 控制台界面 上,输出二维数组 
  220.     /// </summary> 
  221.     /// <param name="i"></param> 
  222.     internal void Printf(int i, Direction inaitialDirection, Clock clock) 
  223.     { 
  224.         if (i % 2 == 0) 
  225.         { 
  226.             i++; 
  227.         } 
  228.         int[][] a = GetArray(i, inaitialDirection, clock); 
  229.         for (int j = 0; j < a.Length; j++) 
  230.         { 
  231.             Console.Write("        "); 
  232.             for (int k = 0; k < a.Length; k++) 
  233.             { 
  234.                 Console.Write(PrintFormat(a[j][k])); 
  235.             } 
  236.             Console.WriteLine("\r\n\r\n"); 
  237.         } 
  238.     } 
  239.  
  240.     /// <summary> 
  241.     /// 格式化输出数字格式化,以便对齐 
  242.     /// </summary> 
  243.     /// <param name="m"></param> 
  244.     /// <returns></returns>  
  245.     String PrintFormat(int m) 
  246.     { 
  247.         string s = m.ToString(); 
  248.  
  249.         if (s.Length == 1) 
  250.         { 
  251.             return " " + m + " " + "  " + "  "
  252.         } 
  253.         else if (s.Length == 2) 
  254.         { 
  255.             return s.Substring(0, 1) + " " + s.Substring(1, 1) + "  " + "  "
  256.         } 
  257.         else 
  258.         { 
  259.             return s + "  " + "  "
  260.         } 
  261.     } 
  262.  
  263.  
  264.  
  265. /// <summary> 
  266. /// 定义枚举,上,右,下,左4个方向。 
  267. /// </summary> 
  268. enum Direction 
  269. { top, right, bottom, left } 
  270.  
  271. /// <summary> 
  272. /// 逆时针或顺指针 
  273. /// </summary> 
  274. enum Clock 
  275. { clockwise, anticlockwise } 



//调用方法。


  
  1. static void Main(string[] args) 
  2.     Test2 test = new Test2(); 
  3.  
  4.     Console.WriteLine("\r\n"); 
  5.     test.Printf(9, Direction.right, Clock.clockwise); 
  6.     Console.WriteLine("\r\n---------\r\n------------------\r\n"); 
  7.     test.Printf(9, Direction.right, Clock.anticlockwise); 
  8.     Console.WriteLine("\r\n---------\r\n------------------\r\n"); 
  9.  
  10.     test.Printf(9, Direction.bottom, Clock.clockwise); 
  11.     Console.WriteLine("\r\n---------\r\n------------------\r\n"); 
  12.     test.Printf(9, Direction.bottom, Clock.anticlockwise); 
  13.     Console.WriteLine("\r\n---------\r\n------------------\r\n"); 
  14.  
  15.     test.Printf(9, Direction.left, Clock.clockwise); 
  16.     Console.WriteLine("\r\n---------\r\n------------------\r\n"); 
  17.     test.Printf(9, Direction.left, Clock.anticlockwise); 
  18.     Console.WriteLine("\r\n---------\r\n------------------\r\n"); 
  19.  
  20.     test.Printf(9, Direction.top, Clock.clockwise); 
  21.     Console.WriteLine("\r\n---------\r\n------------------\r\n"); 
  22.     test.Printf(9, Direction.top, Clock.anticlockwise); 
  23.     Console.WriteLine("\r\n---------\r\n------------------\r\n");