黑马程序员技术交流社区

标题: 完美打印n阶螺旋方阵(使用二维数组) [打印本页]

作者: 清香白莲    时间: 2015-4-29 22:31
标题: 完美打印n阶螺旋方阵(使用二维数组)
  1. /**
  2. * 1.如题,完美打印n阶螺旋方阵。程序只使用了简单的输入输出函数。
  3. * 2.你可以测试程序,输出的方阵实现了数字右对齐,效果非常美观。
  4. * 3.测试程序时,键入一个整数n,代表方阵的阶数。程序不做输入检查,请输入有意义的整数。
  5. * 4.如果在命令行模式下运行程序,建议n<=20,一般cmd窗口的一行只能容纳80个字符。
  6. * 5.测试样例:10
  7. *  1   2   3   4   5   6   7   8   9  10
  8. * 36  37  38  39  40  41  42  43  44  11
  9. * 35  64  65  66  67  68  69  70  45  12
  10. * 34  63  84  85  86  87  88  71  46  13
  11. * 33  62  83  96  97  98  89  72  47  14
  12. * 32  61  82  95 100  99  90  73  48  15
  13. * 31  60  81  94  93  92  91  74  49  16
  14. * 30  59  80  79  78  77  76  75  50  17
  15. * 29  58  57  56  55  54  53  52  51  18
  16. * 28  27  26  25  24  23  22  21  20  19
  17. *
  18. * 6.程序不再给出注释,因为我没有时间。
  19. * 7.将来有机会的话,我会给出用一维数组和不用数组实现的办法。
  20. *
  21. * 8.@author 清香白莲
  22. */
  23. import java.util.*;

  24. public class HelloJava
  25. {
  26.         public static int[][] getScrewMatrix(int n)
  27.         {
  28.                 int[][] a = new int[n][n];
  29.                 int x = 1;
  30.                 int i = 0;
  31.                 int j = 0;
  32.                 int d = 0;
  33.                
  34.                 while (x <= n * n)
  35.                 {
  36.                         switch(d)
  37.                         {
  38.                         case 0:
  39.                                 a[i][j++] = x++;
  40.                                 if (j == n || a[i][j] != 0)
  41.                                 {
  42.                                         --j;
  43.                                         ++i;
  44.                                         d = (d + 1) % 4;
  45.                                 }
  46.                                 break;
  47.                         case 1:
  48.                                 a[i++][j] = x++;
  49.                                 if (i == n || a[i][j] != 0)
  50.                                 {
  51.                                         --i;
  52.                                         --j;
  53.                                         d = (d + 1) % 4;
  54.                                 }
  55.                                 break;
  56.                         case 2:
  57.                                 a[i][j--] = x++;
  58.                                 if (j == -1 || a[i][j] != 0)
  59.                                 {
  60.                                         ++j;
  61.                                         --i;
  62.                                         d = (d + 1) % 4;
  63.                                 }
  64.                                 break;
  65.                         case 3:
  66.                                 a[i--][j] = x++;
  67.                                 if (i == -1 || a[i][j] != 0)
  68.                                 {
  69.                                         ++i;
  70.                                         ++j;
  71.                                         d = (d + 1) % 4;
  72.                                 }
  73.                                 break;
  74.                         }
  75.                 }
  76.                
  77.                 return a;
  78.         }
  79.        
  80.         public static void printScrewMatrix(int[][] a)
  81.         {
  82.                 int bit = getNumLength(a.length * a.length) + 1;
  83.                
  84.                 for (int i = 0; i < a.length; i++)
  85.                 {
  86.                         for (int j = 0; j < a[i].length; j++)
  87.                         {
  88.                                 for (int k = 1; k <= bit - getNumLength(a[i][j]); k++)
  89.                                         System.out.print(" ");
  90.                                 System.out.print(a[i][j]);
  91.                         }
  92.                         System.out.println();
  93.                 }
  94.         }
  95.        
  96.         public static int getNumLength(int n)
  97.         {
  98.                 int i = 0;
  99.                
  100.                 do
  101.                 {
  102.                         ++i;
  103.                         n /= 10;
  104.                 } while (n != 0);
  105.                
  106.                 return i;
  107.         }
  108.        
  109.         public static void main(String[] args)
  110.         {
  111.                 printScrewMatrix(getScrewMatrix(new Scanner(System.in).nextInt()));
  112.         }
  113. }
复制代码



作者: 清香白莲    时间: 2015-4-29 22:33
还请版主能给点技术分。
作者: Oh.Ba    时间: 2015-4-29 22:51
厉害。我弄不明白
作者: hejinze    时间: 2015-4-29 22:55
哎,看不懂。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2