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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈圳 于 2013-4-30 12:55 编辑
  1. <p>
  2. import java.util.Arrays;
  3. public class ArraysTest {</p><p>    /**螺旋矩阵数组.
  4.      * @param args
  5.      */
  6.     public static void main(String[] args) {
  7.      retangleArrays(5);
  8.     }
  9.     public static void retangleArrays(int num){
  10.      int index;//取得数组最中间的值
  11.      String[][] temp=new String[num+2][num+2];
  12.      int[][] arr=new int[num][num];
  13.             if(num%2==0){//取开始时的坐标位置
  14.                 index=(num>>1)-1;
  15.                 arr=getArray2(num,index);
  16.             }
  17.             else {
  18.              index=num>>1;
  19.              arr=getArray1(num,index);
  20.             }
  21.         for(int i=0;i<num+2;Arrays.fill(temp[i++],"*"));//进行外圈赋'*';
  22.         for(int i=0;i<arr.length;i++){
  23.          for(int j=0;j<arr.length;j++)
  24.           temp[i+1][j+1]=""+arr[i][j];//进行赋值操作
  25.         }
  26.         for(int i=0;i<temp.length;i++)//这里输出格式不好,但是最简单
  27.          System.out.println(Arrays.toString(temp[i]));
  28.     }
  29.     public static int[][] getArray2(int num,int index){//这个是偶数
  30.       int[][] arr=new int[num][num];
  31.       int[][] temp=getArray1(num-1,index);//这里调用第一个奇数方法,得到奇数螺旋的数组.然后在外围加上一圈就行了
  32.       for(int i=0;i<temp.length;i++)//这里赋值,但总感觉有更好的方式完成这步...
  33.        for(int j=0;j<temp[i].length;j++){
  34.         arr[i][j]=temp[i][j];
  35.        }
  36.       int count=num*num,length=num*2-1;//这里等于4--16;
  37.       for(int i=0;i<=length;i++){//赋上最外层一圈
  38.        if(i<num)
  39.         arr[num-1][i]=count--;
  40.        else
  41.         arr[length-i][num-1]=count--;
  42.       }
  43.          return arr;
  44.     }
  45.     public static int[][] getArray1(int num,int index){//这个是奇数螺旋
  46.        int arr[][]=new int[num][num];
  47.           int rows=index;//二维的横坐标
  48.           int cols=index;//二维的纵坐标
  49.           int fixRow=index-1;//内层循环的值最小
  50.           int fixCol=index+1;//内层循环的值最小
  51.           arr[rows][cols]=1;
  52.           for(int i=2;i<=arr.length*arr.length;){
  53.                   if(cols==fixRow&&rows==fixRow){//当走到小边缘的时候,就扩大其运转范围
  54.                           if(fixRow!=0){
  55.                                   fixRow--;
  56.                                   fixCol++;
  57.                           }
  58.                   }
  59.                   if(cols<=fixCol&&rows<=fixCol){
  60.                           if(cols<fixCol){
  61.                                   cols++;
  62.                                   arr[rows][cols]=i;
  63.                                   i++;
  64.                           }else{
  65.                                   rows++;
  66.                                   arr[rows][cols]=i;
  67.                                   i++;
  68.                           }
  69.                   }
  70.                   if(cols==fixCol&&rows==fixCol){//当走到最大边缘的时候
  71.                           for(int j=0;j<fixCol*2+1;j++){
  72.                                   if(cols>fixRow){
  73.                                           cols--;
  74.                                           arr[rows][cols] = i;
  75.                                           i++;
  76.                                   }        else if(rows>fixRow){
  77.                                                   rows--;
  78.                                                   arr[rows][cols] = i;
  79.                                                   i++;
  80.                                           }
  81.                           }
  82.                   }
  83.           }
  84.           return arr;
  85.     }
  86. }
  87. </p>
  88. 怎么设置仅作者可见....???
复制代码

点评

这个设置作者可见,我到时候有空告诉你啊,你也可以私下问我,现在有点忙,嘿嘿  发表于 2013-5-1 14:17
最好将注释写在语句的上面,注释要适当,不要太多;打印没按要求做,输出效果不正确的;希望可以改进一下。不过思路比较好,不错。  发表于 2013-5-1 10:22

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

回复 使用道具 举报
学习学习:)
回复 使用道具 举报
额????????????来看看
回复 使用道具 举报
先来看看吧
回复 使用道具 举报
Sword 金牌黑马 2013-4-30 11:34:35
25#
先看看再说吧
回复 使用道具 举报
看看题目~
回复 使用道具 举报
先看看题
回复 使用道具 举报
先看下题把。
回复 使用道具 举报
{:soso_e132:}
回复 使用道具 举报
什么东东?
回复 使用道具 举报
其实早看到这帖子了,只是一直犹豫回不回,回了就必须做题,但是还没空思考。我还是先拿题以后有时间再做吧   {:soso_e102:}
回复 使用道具 举报
本帖最后由 蔡汉康 于 2013-5-1 16:36 编辑

提交作业了~!!!!!!!
不知道为什么只能到5x5的矩阵
6x6的矩阵就不行了!!!

WWW.png (11.4 KB, 下载次数: 0)

WWW.png

蔡汉康-----LuoXuanArray2.rar

1.02 KB, 阅读权限: 100, 下载次数: 1

点评

思路较清晰,注释较规范,层次也不错;但是不能完全实现打印任意自然数的结果;再输入0的时候应该有个友好的提示,不过很不错了。  发表于 2013-5-2 14:09

评分

参与人数 1技术分 +3 收起 理由
黄玉昆 + 3

查看全部评分

回复 使用道具 举报
我在考虑要不要贴代码......
回复 使用道具 举报
曹睿翔 来自手机 金牌黑马 2013-4-30 13:13:40
34#
本帖最后由 曹睿翔 于 2013-4-30 22:22 编辑

我来晚了啊,玉圣!时间不对吧,48小时not equal to今天十点到明天吧9点吧,我还在店里,回宿舍看看
我的网挂了,上传附件打不开。我去年买了个表联通
  1. /*貌似开始学java也没打过这么多次的二维数组
  2. 说说思路。
  3. 1、先得到由内向外的螺旋状的二维数组
  4.   1)迭代方法获取。int[3][3]由int[2][2]的差别在于多了一维(也就是两个边)。用循环控制加上这两个边
  5.   2)加上两个边后,是空心的,这时就需要双重for循环把int[2][2]填进int[3][3]中
  6. 2、打印就行了*/
  7. public class Test {

  8.         /**
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 // TODO Auto-generated method stub
  13.                 //获取二维数组array
  14.                 int[][] array = getArray(7);
  15.                 /*for(int[] arr:array){
  16.                         for(int a:arr){
  17.                                 System.out.println(a);
  18.                         }
  19.                 }*/
  20.                 //添加*后打印
  21.                 addXX(array);
  22.                
  23.                
  24.         }
  25.         
  26.         public static void addXX(int[][] array){
  27.                 //需要注意的就一点,个位数字占的空间小,想对齐加tab
  28.                 int len = array.length;
  29.                 for(int x= 0;x<=len+1;x++){
  30.                         System.out.print("*\t");
  31.                 }
  32.                 System.out.println();
  33.                 for(int x = 0;x<len;x++){
  34.                         System.out.print("*\t");
  35.                         for(int y = 0 ;y<len;y++){
  36.                                 System.out.print(""+array[x][y]+"\t");
  37.                         }
  38.                         System.out.println("*\t");
  39.                                 
  40.                         }
  41.                
  42.                 for(int x= 0;x<=len+1;x++){
  43.                         System.out.print("*\t");
  44.                 }
  45.         }
  46.         
  47.         public static int[][] getArray(int n){
  48.                 int[][] newArr = null;
  49.                 int[][] arr = null;
  50.                 if(n==1){
  51.                          newArr = new int[][]{{1}};
  52.                          return newArr;
  53.                 }else if(n==2){
  54.                          newArr= new int[][]{{1,2},{4,3}};
  55.                          return newArr;
  56.                 }else if(n>2){
  57.                          newArr = new int[n][n];
  58.                          int a = n-1;
  59.                          arr = getArray(a);
  60.                          //当n>2时就需要考虑 ,把维度小的数组加进维度大的中去,分两种情况,一种是偶维度插进奇伟渡,另外一种相反
  61.                          if(n%2==0){
  62.                                  for(int x = 0; x<n-1;x++){
  63.                                          for(int y =0;y<n-1;y++){
  64.                                                  newArr[x][y] =arr[x][y];
  65.                                          }
  66.                                  }
  67.                          }else{
  68.                                  for(int x = 0; x<n-1;x++){
  69.                                          for(int y = 0;y<n-1;y++){
  70.                                                  newArr[x+1][y+1] = arr[x][y];
  71.                                          }
  72.                                  }
  73.                                  
  74.                          }
  75.                          //给高一维的数据加边
  76.                          if(n%2==0){
  77.                                     int x = arr[0][n-2];
  78.                                         for(int b = 0;b <n;b++){
  79.                                                 System.out.println(x);
  80.                                                 newArr[b][n-1] = ++x;
  81.                                                 System.out.println(newArr[b][n-1]);
  82.                                         }
  83.                                         int y =newArr[n-1][n-1];
  84.                                         for(int c = 0; c<n-1; c++){
  85.                                                 newArr[n-1][n-2-c] = ++y;
  86.                                         }               
  87.                                 }else{
  88.                                         //提升x作用域
  89.                                         int x = arr[n-2][0];
  90.                                         for(int b = 0;b<n;b++){
  91.                                                 //int x = arr[n-2][0];这句不能放在里边,不然x在循环过程中一直不变
  92.                                                 //System.out.println(x);
  93.                                                 newArr[n-b-1][0] = ++x;
  94.                                                 //System.out.println(newArr[0][0]);
  95.                                         }
  96.                                         int y = newArr[0][0];//与上句类似
  97.                                         for(int c =0;c<n-1;c++){                                                
  98.                                                 newArr[0][c+1] = ++y;               
  99.                                         }
  100.                                        
  101.                                 }
  102.                          return newArr;
  103.                         
  104.                 }else{
  105.                         System.out.println("输入错误");
  106.                 }
  107.                
  108.                 //n=3,arr[1][]
  109.                
  110.                 return newArr;
  111.                
  112.         }
  113.          

  114. }
复制代码

点评

思路比较清晰,层次也不错,就是代码过于稀少,可以在丰富一下,还有就是你能不能把你的测试语句去掉或者注释掉啊,你自己打印试试。总体很好  发表于 2013-5-1 10:27

评分

参与人数 1技术分 +4 黑马币 +3 收起 理由
黄玉昆 + 4 + 3

查看全部评分

回复 使用道具 举报
上图不解释 .....

F2}DN~5T16Z67TLM_`VXNZU.jpg (16.08 KB, 下载次数: 0)

F2}DN~5T16Z67TLM_`VXNZU.jpg
回复 使用道具 举报
  1. class  inVrileMatrix
  2. {
  3.          private int n;
  4.          inVrileMatrix(int n)
  5.          {
  6.                  this.n = n;
  7.                  showMatrix();
  8.          }
  9.          public void showMatrix()
  10.          {
  11.                  if(n%2==0)
  12.                          show1(n);
  13.                  else show2(n);
  14.          }
  15.          /*
  16.           * show1 和show2 方法思路基本一致  每次确定是个坐标 下面的 Up*  Low*  Right*  Left*  是 上下左右四个点   这四个点 一用就两个值
  17.           * Up* 是左上  Low 是右下  Right 是右下  Left 是左下
  18.           * 所以可以用两个值去替换这八个变量  不想去 去替换了  myeclipse 提供了替换工具 没空了
  19.           * 每次给两行两列赋值
  20.           *
  21.           * 其中的四个for 循环还可以在次封装  好吧我承认我懒了 每次传递 四个参数就可以了
  22.           *
  23.           * 当我把 偶数 和 奇数的 矩阵打印出来的时候 猛然间发现 原来只要一个 show就可以了  在判断是否是偶数 在确实是否去翻转 不信你自己去试一试
  24.           *
  25.           */
  26.          
  27.          public static void show1(int n)
  28.          {
  29.                     int[][] mat = new int[n][n];
  30.                     int[] max = new int[n];
  31.                     int t = n;
  32.                     for(int i=0;i<n;i++)
  33.                     {
  34.                             max[i] = t*t;
  35.                             t-=2;
  36.                             if(t<=0)break;
  37.                     }
  38.           
  39.                     int Upx=0,Upy=0,Lowx=n-1,Lowy=n-1,Rightx=0,Righty=n-1,Leftx=n-1,Lefty=0;
  40.                     for(int i=0;i<n/2;i++)
  41.                     {
  42.                             if(i!=0)
  43.                             {
  44.                                     Upx += 1; Upy += 1;
  45.                                     Lowx -= 1; Lowy -= 1;
  46.                                     Rightx += 1; Righty -= 1;
  47.                                     Leftx -= 1; Lefty += 1;
  48.                             }
  49.                             mat[Leftx][Lefty] = max[i];
  50.                             for(int y=Lefty+1;y<=Lowy;y++)
  51.                                     mat[Leftx][y] = mat[Leftx][y-1]-1;
  52.                             for(int x=Leftx-1;x>=Rightx;x--)
  53.                                     mat[x][Righty] = mat[x+1][Righty]-1;
  54.                             for(int y=Righty-1;y>=Upy;y--)
  55.                                     mat[Upx][y] = mat[Upx][y+1] -1;
  56.                             for(int x=Upx+1;x<Leftx;x++)
  57.                                     mat[x][Upy] = mat[x-1][Upy] -1;
  58.                     }
  59.                     Print( n, mat);
  60.           }
  61.             

  62.             public static void show2(int n)
  63.             {
  64.                     int[][] mat = new int[n][n];
  65.                     int[] max = new int[n];
  66.                     int t = n;
  67.                     for(int i=0;i<n;i++)
  68.                     {
  69.                             max[i] = t*t;
  70.                             t-=2;
  71.                             if(t<=0)break;
  72.                     }
  73.                     int Rightx=0,Righty=n-1,Upx=0,Upy=0,Leftx=n-1,Lefty=0 ,Lowx=n-1,Lowy=n-1;
  74.                     mat[n/2][n/2]=1;
  75.                     for(int i=0;i<n/2;i++)
  76.                     {
  77.                             if(i!=0)
  78.                             {
  79.                                     Upx += 1; Upy += 1;
  80.                                     Lowx -= 1; Lowy -= 1;
  81.                                     Rightx += 1; Righty -= 1;
  82.                                     Leftx -= 1; Lefty += 1;
  83.                             }
  84.                             mat[Rightx][Righty] = max[i];
  85.                            
  86.                             for(int y=Righty-1;y>=Upy;y--)
  87.                                     mat[Rightx][y] = mat[Rightx][y+1]-1;
  88.                            
  89.                             for(int x=Upx+1;x<=Leftx;x++)
  90.                                     mat[x][Upy] = mat[x-1][Upy]-1;
  91.                             for(int y=Lefty+1;y<=Lowy;y++)
  92.                                     mat[Leftx][y] = mat[Leftx][y-1]-1;
  93.                             for(int x=Lowx-1;x>Rightx;x--)
  94.                                     mat[x][Lowy] = mat[x+1][Lowy]-1;
  95.                     }
  96.                     Print( n, mat);
  97.             }
  98.             /*
  99.              * 就是用来打印数组的  玉圣用 *   来包围数组
  100.              * 怎么实现的自己看代码了
  101.              */
  102.             public static void Print(int n,int[][] mat)
  103.             {
  104.                     for(int i=0;i<n+2;i++)
  105.                         System.out.print("*\t");
  106.                         System.out.println();
  107.                         for(int h=0;h<n;h++)
  108.                         {
  109.                                 System.out.print("*\t");
  110.                                 for(int j=0;j<n;j++)
  111.                                         System.out.print(mat[h][j]+"\t");
  112.                                 System.out.println("*\t");
  113.                         }
  114.                         for(int i=0;i<n+2;i++)
  115.                             System.out.print("*\t");
  116.                             System.out.println();
  117.             }
  118.          
  119. }

  120. public class Main {
  121.         public static void main(String[] args)
  122.         {
  123.                 inVrileMatrix  T = new inVrileMatrix(5);
  124.                 T = new inVrileMatrix(6);
  125.         }

  126. }
复制代码

点评

你小子思路比较清晰,就是不在正确的地方加注释,加上适当的注释对你有好处的。还有就是你试试0,是不是应该不输出啊,给个提示就行了。  发表于 2013-5-1 10:33

评分

参与人数 1技术分 +3 收起 理由
黄玉昆 + 3

查看全部评分

回复 使用道具 举报
陈山洪 来自手机 高级黑马 2013-4-30 13:51:11
37#
看看。。。。
回复 使用道具 举报
看看 我来挑战一下:)
回复 使用道具 举报
     看看题
回复 使用道具 举报
菜鸟也来玩玩
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马