黑马程序员技术交流社区

标题: 谁能帮解下这道题 [打印本页]

作者: 15242694137    时间: 2016-6-29 22:24
标题: 谁能帮解下这道题
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
作者: 小雨皮    时间: 2016-7-1 18:05
  1. public class tt {
  2.         public static void main(String[] args) {
  3.                 int[][] arr = arrs();
  4.                 for (int i = 0; i < arr.length; i++) {
  5.                         for (int j = 0; j < arr[i].length; j++) {
  6.                                 if(arr[i][j]<10)
  7.                                         System.out.print("0"+arr[i][j]+ " ");
  8.                                 else
  9.                                 System.out.print(arr[i][j]+ " ");
  10.                         }
  11.                         System.out.println();
  12.                 }
  13.                
  14.                
  15.                
  16.         }

  17.         public static int[][] arrs() {
  18.         //        System.out.println("请输入方阵行数或列数:");
  19.         //        Scanner sc=new Scanner(System.in);
  20.         //        int le=sc.nextInt();// 数组长度
  21.                 int le=9;
  22.         //        System.out.println("请检查方阵是否正确");
  23.                
  24.                 int arr[][] = new int[le][le];
  25.                 int x = 0;// 小数组下标,横向
  26.                 int y = 0;// 数组下标,纵向
  27.                 int n = 1;// 显示数字
  28.                
  29.                 // 螺旋顺序是右》下》左》上》右。。
  30.                 int c = 0;// 圈数从最外面是第一圈c=0
  31.                 int t = 1;// 1右2下3左4上
  32.                 boolean b=true;
  33. while(b){
  34.                 while (t == 1 && x < le - c && x >= c) {
  35.                         arr[y][x++] = n++;
  36.                         //x++;
  37.                         //n++;
  38.                        
  39.                         if (x == le - c) {
  40.                                
  41.                                 t = 2;
  42.                         }
  43.                         if (n == le * le+1)
  44.                                 b=false;
  45.                 }
  46.                 x = le - c - 1;
  47.                 y = c + 1;
  48.                 while (t == 2 && y > c && y < le - c) {
  49.                         arr[y++][x] = n++;
  50.                         //y++;
  51.                         //n++;
  52.                         if (y == le - c) {
  53.                                 t = 3;
  54.                                
  55.                         }
  56.                         if (n == le * le+1)
  57.                                 b=false;
  58.                 }
  59.                 y = le - c - 1;
  60.                 x = le - c - 2;
  61.                 while (t == 3 && x < le - c - 1 && x >= c) {
  62.                         arr[y][x--] = n++;
  63.                         //n++;
  64.                         //x--;
  65.                         if (x < c) {
  66.                                 t = 4;
  67.                                
  68.                         }
  69.                        
  70.                         if (n == le * le+1)
  71.                                 b=false;
  72.                 }
  73.                 x = c;
  74.                 y = le - c - 2;
  75.                 while (t == 4 && y > c && y < le - c - 1) {
  76.                         arr[y--][x] = n++;
  77.                         //y--;
  78.                         //n++;
  79.                         if (y == c) {
  80.                                 t = 1;
  81.                                 c++;
  82.                         }
  83.                         if (n == le * le+1)
  84.                                 b=false;
  85.                 }
  86.                 x = c;
  87.                 y = c;
  88.                
  89.                
  90.                
  91. }
  92.                 return arr;
  93.         }
  94.        
  95. }
复制代码


作者: 小雨皮    时间: 2016-7-1 18:13
  1. public class text {

  2.           public static void main(String[] args) {
  3.           // 根据n创建一个二维数组
  4.           int n = 5;
  5.           int[][] arr = new int[n][n];
  6.           // 调用数组赋值的方法
  7.           method(arr);
  8.           // 将数组遍历出来
  9.           for (int i = 0; i < arr.length; i++) {
  10.                   for (int j = 0; j < arr.length; j++) {
  11.                           System.out.print(arr[i][j] + "\t");
  12.                   }
  13.                   System.out.println("\n");
  14.           }

  15.   }

  16.   // 二维数组赋值方法
  17.   public static void method(int[][] arr) {
  18.           // 创建数组的两个索引变量
  19.           int i = 0;
  20.           int j = 0;
  21.           // 通过 max 和min控制索引i,j的变化
  22.           int max = arr.length - 1;
  23.           int min = 0;
  24.           // 所需要赋的值
  25.           int num = 1;

  26.           while (min <= max) {
  27.                   // 1、i不变j++ 向右
  28.                   while (j < max) {
  29.                           arr[i][j++] = num++;
  30.                   }
  31.                   // 2、j不变i++ 向下
  32.                   while (i < max) {
  33.                           arr[i++][j] = num++;
  34.                   }
  35.                   // 3、i不变j-- 向左
  36.                   while (j > min) {
  37.                           arr[i][j--] = num++;
  38.                   }
  39.                   // 4、j不变i-- 向上
  40.                   while (i > min) {
  41.                           arr[i--][j] = num++;
  42.                   }
  43.                   // 由于可能在n为奇数的时候无法为中心那个数赋值所以要补上这个数的赋值
  44.                   if (min == max) {
  45.                           arr[i][j] = num;
  46.                   }
  47.                   max--;
  48.                   min++;
  49.                   // 循环一圈又开始想有赋值j++
  50.                   j++;
  51.                   // 由于向上的时候最后一次赋值i多减了一次所以每次外循环都要将i补回来
  52.                   i++;
  53.           }
  54.   }
  55. }
复制代码
这个是别人写的属于简单方法,不过大体思路是一样的都是,从外面一圈圈循环先给数组赋值,这个每一圈赋值的长度都一样(好看懂),上面的我感觉你要是看懂了应该理解的会更深点





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