A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 九天玄妖 中级黑马   /  2016-4-26 14:40  /  679 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚才笔试遇到这题,没有想到怎么做的,有没有大神。
8、写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7






6 个回复

倒序浏览
并没有你想象的那么难哦
  1. /*
  2. * 需求:
  3. * 写一个方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式的顺序排列.

  4. */
  5. public class Test9_二维数组螺旋 {
  6.         public static void main(String[] args) {
  7.                 int a = 5;
  8.                 int[][] arr = new int[a][a];
  9.                 fuzhi(arr, a);
  10.                 bianli(arr);
  11.         }

  12.         private static void fuzhi(int[][] arr, int a) {
  13.                 // 定义边界
  14.                 int max = a - 1;
  15.                 int min = 0;
  16.                 // 定义两个变量,作为二维数组的索引
  17.                 int x = 0;
  18.                 int y = 0;
  19.                 int num = 1;
  20.                 while (min <= max) {
  21.                         // 向右走
  22.                         while (y < max) {
  23.                                 arr[x][y] = num++;
  24.                                 y++;
  25.                         }
  26.                         // 向下走
  27.                         while (x < max) {
  28.                                 arr[x][y] = num++;
  29.                                 x++;
  30.                         }
  31.                         // 向左走
  32.                         while (y > min) {
  33.                                 arr[x][y] = num++;
  34.                                 y--;
  35.                         }
  36.                         // 向上走
  37.                         while (x > min) {
  38.                                 arr[x][y] = num++;
  39.                                 x--;
  40.                         }
  41.                         // 一圈赋值完,边界改变,x和y的值又回到了0,0
  42.                         max--;
  43.                         min++;
  44.                         x++;
  45.                         y++;
  46.                         //当a为奇数的时候,中间无法被赋值
  47.                         if(min == max) {
  48.                                 arr[x][y] =num;
  49.                         }
  50.                 }
  51.         }

  52.         private static void bianli(int[][] arr) {
  53.                 for (int i = 0; i < arr.length; i++) {
  54.                         for (int j = 0; j < arr.length; j++) {
  55.                                 System.out.print(arr[i][j]+"  ");
  56.                         }
  57.                         System.out.println();
  58.                 }
  59.         }
  60. }
复制代码
回复 使用道具 举报
复制下,回去研究研究。
回复 使用道具 举报
套路有点深,二维数组真的没有看的这么细,想不到
回复 使用道具 举报
赞一个!!
回复 使用道具 举报
真的要学习下,以前遇到这问题没解决的。
回复 使用道具 举报
  1. import java.util.Scanner;

  2. public class 回形取数 {

  3.         private static Scanner sc;

  4.         public static void main(String[] args) {

  5.                 sc = new Scanner(System.in);
  6.                 String[] str1 = sc.nextLine().split(" ");
  7.                 int x = Integer.parseInt(str1[0]);
  8.                 int y = Integer.parseInt(str1[1]);
  9.                
  10.                 String[][] arr = new String[x][y];
  11.                 for (int i = 0; i < x; i++) {
  12.                         String[] str = sc.nextLine().trim().split(" ");
  13.                         arr[i] =str;
  14.                        
  15.                 }
  16.                 spiralOrderPrint(arr);
  17.         }

  18.         public static void spiralOrderPrint(String[][] matrix) {
  19.                 int tR = 0;
  20.                 int tC = 0;
  21.                 int dR = matrix.length - 1;
  22.                 int dC = matrix[0].length - 1;

  23.                 while (tR <= dR && tC <= dC) {
  24.                         printEdge(matrix, tR++, tC++, dR--, dC--);
  25.                 }

  26.         }

  27.         public static void printEdge(String[][] m, int tR, int tC, int dR, int dC) {
  28.                 if (tR == dR) {
  29.                         for (int i = tC; i <= dC; i++) {
  30.                                 System.out.print(m[tR][i] + " ");
  31.                         }
  32.                 } else if (tC == dC) {
  33.                         for (int i = tR; i <= dR; i++) {
  34.                                 System.out.print(m[i][tC] + " ");
  35.                         }
  36.                 } else {
  37.                         int curC = tC;
  38.                         int curR = tR;
  39.                         while (curR != dR) {
  40.                                 System.out.print(m[curR][tC] + " ");
  41.                                 curR++;
  42.                         }
  43.                         while (curC != dC) {
  44.                                 System.out.print(m[dR][curC] + " ");
  45.                                 curC++;
  46.                         }
  47.                         while (curR != tR) {
  48.                                 System.out.print(m[curR][dC] + " ");
  49.                                 curR--;
  50.                         }
  51.                         while (curC != tC) {
  52.                                 System.out.print(m[tR][curC] + " ");
  53.                                 curC--;
  54.                         }
  55.                 }
  56.         }
  57. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马