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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 官珺伟 高级黑马   /  2014-4-30 08:09  /  6164 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 官珺伟 于 2014-5-1 11:58 编辑

package com.itheima;
/*9、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印
*
* 1   2  3  4
* 12  13 14 5
* 11  16 15 6
* 10        9 8  7
*
* */
public class Test9 {
    public static void main(String[] args){
            arrayNum(4);
    }

//便于改代码..输入不同y值输出不同的二维数列
    private static void arrayNum(int y)
    {
            int[][] arr=new int[y][y];
            int n=arr.length;
            int max=0;
            int c=0;
            specArr(arr,n,max,c);
            arrPrint(arr);
    }

   //高级for输出打印用的
    private static void arrPrint(int[][] h) {
            for(int[] in:h)
            {
                    for(int t:in)
                    {        
                            if(t<10)System.out.print(" "+t+" ");
                            else System.out.print(t+" ");
                    }
                    System.out.println();
            }
            
    }
   
//利用递归,一层一层写进去..
    private static void specArr(int[][] arr,int n,int max,int count) {
            
            if(n>0){
            int j=0;
            for(int i=0;i<(n-1)*4;i++)
            {
                    if (i<n-1)  arr[0+count][i+count]=++max;
                    else if (i<2*n-2) arr[count+j++][arr.length-1-count]=++max;
                    else if (i<3*n-3) arr[arr.length-1-count][(j--)+count]=++max;
                    else if (i<4*n-4) arr[arr.length-1-(j++)-count][0+count]=++max;                        
            }        
            if(n==1){arr[arr.length/2][arr.length/2]=max+1 ;}//注意到 当y值为奇数时,会有循环到n=1的情况,需要补进数组最中间值
            count++;
            n-=2;
            specArr(arr,n,max,count);
            }
    }

}  

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

20 个回复

倒序浏览
楼主 我这里有个简单的  也有注释

  1. package com.itheima;

  2. import java.util.Scanner;

  3. /**
  4. * 需求: 9、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
  5.         1  2  3  4
  6.         12 13 14 5
  7.         11 16 15 6
  8.         10  8  9 7
  9.        
  10.         @author 刘阳文
  11. * */
  12. public class Test9
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                 Scanner input = null; //键盘录入

  17.                 try
  18.                 {
  19.                         input = new Scanner(System.in);
  20.                         System.out.println("请输入数字:");
  21.                         // 要打印的长度
  22.                         int count = input.nextInt();

  23.                         // 声明等长的二维数组
  24.                         int[][] arr = new int[count][count];

  25.                         // 生成螺旋数组
  26.                         genericArray(arr, (count * count));

  27.                         // 打印结果到控制台
  28.                         System.out.println("生成的螺旋数组如下:");
  29.                         print(arr, count);

  30.                 } catch (Exception e)
  31.                 {
  32.                         System.out.println("输入非法,请输入数字");
  33.                 } finally
  34.                 {
  35.                         try
  36.                         {
  37.                                 if (input != null)
  38.                                         input.close();
  39.                         } catch (Exception e2)
  40.                         {
  41.                                 System.out.println("关闭流失败");
  42.                         }
  43.                 }

  44.         }

  45.         // 生成螺旋数组
  46.         private static void genericArray(int[][] arr, int value)
  47.         {
  48.                 int n = 1;// 初始数值

  49.                 // (arr.length+1)/2是圈数
  50.                 for (int i = 0; i < (arr.length + 1) / 2; i++)
  51.                 {
  52.                         int index = arr.length - i - 1;
  53.                         // 大圈套小圈
  54.                         if (quan(arr, i, index, n, value) != null)
  55.                                 n = quan(arr, i, index, n, value);
  56.                 }

  57.         }

  58.         // 跑圈
  59.         private static Integer quan(int[][] arr, int i, int index, int n, int value)
  60.         {
  61.                 // 左 ---> 右
  62.                 for (int j = i; j < index + 1; j++)
  63.                 {
  64.                         arr[i][j] = n++;
  65.                         if (n == value)// 数组数值已满,结束本功能
  66.                                 return null;
  67.                 }
  68.                 // 上 ---> 下 最上面一个去除
  69.                 for (int j = i + 1; j < index + 1; j++)
  70.                 {
  71.                         arr[j][index] = n++;
  72.                 }
  73.                 // 右 ---> 左 最右边一个去除
  74.                 for (int j = index - 1; j >= i; j--)
  75.                 {
  76.                         arr[index][j] = n++;
  77.                 }
  78.                 // 下 ---> 上 去除最上面一个和最下面一个
  79.                 for (int j = index - 1; j > i; j--)
  80.                 {
  81.                         arr[j][i] = n++;
  82.                 }
  83.                 return n;
  84.         }

  85.         // 打印二维数组
  86.         private static void print(int[][] arr, int n)
  87.         {
  88.                 for (int i = 0; i < arr.length; i++)
  89.                 {
  90.                         for (int j = 0; j < arr[i].length; j++)
  91.                         {
  92.                                 if (j % n == 0)
  93.                                         System.out.println();
  94.                                 System.out.print(arr[i][j] + "\t");

  95.                         }
  96.                 }
  97.         }
  98. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
有详细注释,用树的深度搜索想法实现。本人原创,转载请注明。
  1. public class Test9 {

  2.         /**
  3.          *  写一方法,打印等长的二维数组,
  4.          * 要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
  5.          * 1  2  3    4
  6.          * 12 13 14   5
  7.          * 11 16 15   6
  8.          * 10 9  8    7
  9.          *                                 
  10.          */
  11.         public static void main(String[] args) {
  12.                 Test9 test = new Test9();
  13.                 //从键盘接收一个数,动态确定数组大小
  14.                 System.out.println("请输入一个数,来作为您的二位数组维度:");
  15.                
  16.                 Scanner sc = new Scanner(System.in);
  17.                 int num = sc.nextInt();
  18.                 int[][] arr = new int[num][num];
  19.                
  20.                 //数组初始值都设置为0,代表每一位还没有被访问过。
  21.                 for(int i=0;i<num;i++){
  22.                         for(int j=0;j<num;j++)
  23.                                 arr[i][j] = 0;
  24.                 }
  25.                
  26.                 /*观察得数字运动路线为:右,下,左,上。所有定义变量来记录上一个数字运动方向。
  27.                   右:1  下:2  左:3 上:4 .第一步肯定往右,所有move初始值为1.
  28.                  */
  29.                 int move =1;
  30.                 int step =0;//记录步数
  31.                 int i=0,j=0;//初始位置
  32.        
  33.                 while(step < num*num){
  34.                         move = test.printArr(arr, i, j, move, num);
  35.                         switch(move){
  36.                                 case 1:
  37.                                         arr[i][j++] = ++step;                               
  38.                                         break;
  39.                                 case 2:
  40.                                         arr[i++][j] = ++step;                               
  41.                                         break;
  42.                                 case 3:
  43.                                         arr[i][j--] = ++step;                               
  44.                                         break;
  45.                                 case 4:
  46.                                         arr[i--][j] = ++step;                               
  47.                                         break;
  48.                                 case -1:
  49.                                         break;
  50.                         }
  51.                 }
  52.        
  53.                 //输出数组
  54.                 for(int m=0;m<num;m++){
  55.                         for(int n=0;n<num;n++){
  56.                                 System.out.print(arr[m][n]+"   ");
  57.                         }               
  58.                         System.out.println("");
  59.                 }
  60.         }
  61.        
  62.         //根据上一步的运动,以及边界条件来判断下一步该往哪个方向运动
  63.         public int printArr(int[][]arr,int i,int j,int move,int num){
  64.                 //如果上一步是向右走,则判断该位置右侧是否已被访问或已达边界,是返回2,指示下一步向下走,否则返回1继续向右走
  65.                 if(move == 1){
  66.                         if((j+1)>=num || arr[i][j+1] !=0){
  67.                                 return 2;
  68.                         }
  69.                         else return 1;
  70.                 }
  71.                 //如果上一步向下走,则判断该位置下面位置是否已被访问或已达边界,是返回3,指示下一步向左走,否返回2继续下走。
  72.                 else if(move == 2){
  73.                         if((i+1)>=num || arr[i+1][j] != 0){
  74.                                 return 3;
  75.                         }
  76.                         else return 2;
  77.                 }
  78.                 //如果上一步向左走,则判断该位置左侧位置是否已被访问或已达边界,是返回4,指示下一步向上走,否返回3继续左走。
  79.                 else if(move == 3){
  80.                         if(j<=0 || arr[i][j-1] != 0){
  81.                                 return 4;
  82.                         }
  83.                         else return 3;
  84.                 }
  85.                 //如果上一步向上走,则判断该位置上面位置是否已被访问或已达边界,是返回1,指示下一步向右走,否返回4继续向上走。
  86.                 else if(move == 4){
  87.                         if(i<=0 || arr[i-1][j] != 0){
  88.                                 return 1;
  89.                         }
  90.                         else return 4;
  91.                 }
  92.                 return -1;
  93.                
  94.         }
  95. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报 1 0
你不要急,只要你发帖,回答,版主都会给你加分的。。
回复 使用道具 举报
ehuashao 发表于 2014-5-1 08:43
有详细注释,用树的深度搜索想法实现。本人原创,转载请注明。

这个思路是极好的:victory:
回复 使用道具 举报
赞一个 顶顶顶!!!!
回复 使用道具 举报
ehuashao 发表于 2014-5-1 08:43
有详细注释,用树的深度搜索想法实现。本人原创,转载请注明。

真的是学习了 你真是大神  
回复 使用道具 举报
ehuashao 发表于 2014-5-1 08:43
有详细注释,用树的深度搜索想法实现。本人原创,转载请注明。

你这思路真心挺好的
回复 使用道具 举报
没有精简一些的吗
回复 使用道具 举报
这么多方法!
回复 使用道具 举报
发现自己好菜啊:'(
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
学习了,谢谢分享
回复 使用道具 举报
都是大神啊。666666666666
回复 使用道具 举报
ehuashao 发表于 2014-5-1 08:43
有详细注释,用树的深度搜索想法实现。本人原创,转载请注明。

思路清晰,写的非常棒~~
回复 使用道具 举报
本帖最后由 小白想学javaEE 于 2016-3-12 19:27 编辑
ehuashao 发表于 2014-5-1 08:43
有详细注释,用树的深度搜索想法实现。本人原创,转载请注明。


赞,这是最适合新手理解得思路了
回复 使用道具 举报
还是没看懂 啊
回复 使用道具 举报
值得学习。。。。
回复 使用道具 举报
学习~学习!学习。学习。
回复 使用道具 举报
非常给力。完美解决了我的笔试题目
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马