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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima;

public class Demo
{
        public static void main(String[] args)
        {       
                setN(6);
        }
       
        public static void setN(int n)
        {
                int[][] arr=new int[n][n];
                int x=0;                                                        //用于记录每次的赋值
                int y=0;                                                        //用于改变每次赋值的起始点
                for(;n>=0;n--)
                {
                        x=give(arr,x,y,n);
                        give(arr,x,y,n);
                        y++;
                }
                printArr(arr);
        }
       
        public static void printArr(int[][] arr)//打印函数
        {
                for (int[] is : arr)
                {
                        for (int i : is)
                        {
                                if(i>=10)
                                        System.out.print(i+" ");
                                else
                                        System.out.print(" "+i+" ");
                        }
                        System.out.println();
                }
        }

        public static int give(int[][] arr,int x,int y,int n)//单圈赋值函数
        {
                for (int a=0;a<n;a++)
                {
                        if(arr[y][a]==0)
                                arr[y][a]=++x;
                }
                for (int a=0;a<n;a++)
                {
                        if(arr[a][n-1]==0)
                                arr[a][n-1]=++x;
                }
                for (int a=n-1;a>=0;a--)
                {
                        if(arr[n-1][a]==0)
                        {
                                arr[n-1][a]=++x;
                        }
                }
                for (int a=n-1;a>=0;a--)
                {
                        if(arr[a][y]==0)
                        {
                                arr[a][y]=++x;
                        }
                }
                return x;
        }
}

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
乔兵 + 1
刘科 + 10 赞一个!

查看全部评分

6 个回复

倒序浏览
好歹也做出来了,不给点技术分么?
回复 使用道具 举报
要么是提问,要么给别人解答才给技术分的
回复 使用道具 举报
taoge 发表于 2013-12-28 13:04
要么是提问,要么给别人解答才给技术分的

自问自答不行么?
回复 使用道具 举报
本帖最后由 高亮亮 于 2013-12-28 13:26 编辑

为什么突然发现是不是我思维模式不契合面对对象思想?怎么觉得看楼主里面各种方法定义,方法嵌套方法,我之前也做了下这个题,感觉就没这么高端的感觉.这个思维是需要改变么?
下面是我的代码.
  1. package cn.itheima_snakearray;
  2. /*
  3. * 需求:
  4. * 写一个方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式的顺序排列.
  5. * 思路分析:        
  6. *         1.观察,可知需求的二维数组中元素应该对应所打印每个数据.行,及n为二维数组的长度及其中每个一位int型一维数组的长度.
  7. *         2.同时,观察得到具体每个int型元素是由行,列边界值完全遍历,再到边界值-1完全遍历...直到填满整个二维数组.
  8. * 实现步骤:
  9. *         1.建立一个每个int型一维数组长度为n,二维数组长度也为n的二维数组.
  10. *         2.遍历赋值.
  11. *         3.打印.
  12. */
  13. public class SnakeArray {
  14.         public static void main(String[] args) {
  15.                 printArray(3);
  16.                 System.out.println("\n------------分-----割-----线------------\n");
  17.                 printArray(7);
  18.         }
  19.         
  20.         public static void printArray(int n)//定义一个按照需求打印二维数组的方法,参数为int型n.
  21.         {
  22.                 int[][] arr=new int[n][n];
  23.                 int x=1;
  24.                 //arr[0][0]
  25.                 for(int p=0;p<n/2;p++){
  26.                                 for (int i = p; i < n-1-p; i++) {//arr[0][0]>>arr[0][n-2]
  27.                                         arr[p][i]=x++;
  28.                                 }
  29.                                 for (int j = p; j < n-1-p;j++) {//arr[0][n-1]>>arr[n-2][n-1]
  30.                                         arr[j][n-1-p]=x++;
  31.                                 }
  32.                                 for(int i=n-1-p;i>p;i--){//arr[n-1][n-1]>>arr[n-1][1]
  33.                                         arr[n-1-p][i]=x++;
  34.                                 }
  35.                                 for(int j=n-1-p;j>p;j--){//arr[n-1][0]>>arr[1][0]
  36.                                         arr[j][p]=x++;
  37.                                 }
  38.                                 //arr[1][0]>>arr[1][1]之后循环上述过程,即可完成偶数n的赋值.
  39.                         }
  40.                 if (n%2!=0) {//若n为奇数,则需要对忽略位置[n/2][n/2]进行赋值.
  41.                         arr[n/2][n/2]=x;
  42.                 }
  43.         
  44.                 for (int i = 0; i < n; i++) {//打印数组.
  45.                         for(int j=0;j<n;j++){
  46.                                 System.out.print("\t"+arr[i][j]+"\t");
  47.                         }
  48.                         System.out.println("\n----------------------------------\n" );
  49.                 }
  50.         }
  51. }
复制代码



回复 使用道具 举报
高亮亮 发表于 2013-12-28 13:24
为什么突然发现是不是我思维模式不契合面对对象思想?怎么觉得看楼主里面各种方法定义,方法嵌套方法,我之前 ...

分开定义方法看着方便呗,写好一个就折叠起来。
回复 使用道具 举报
刘科 初级黑马 2013-12-28 15:59:09
7#
你在黑马这么屌 你哦吉桑知道吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马