黑马程序员技术交流社区

标题: java一个算法问题 [打印本页]

作者: 张甲甲    时间: 2013-5-26 23:42
标题: java一个算法问题
本帖最后由 张甲甲 于 2013-5-29 22:26 编辑

前几天做入学考试题目,一个题目是这样的: 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印: 1  2  3  4  
12 13 14 5  
11 16 15 6  
10 9  8  7  

我是这么想的:
1.按照输出的格式,可以分圈处理,如:把”1-12“看成第一圈,”13-16“看成第二圈。
2.把每一圈分为 上方(如:1-3),右方(如:4-6),下方(如:7-9),左方(如:10-12)   
3.这样就可以以圈作为外层循环 下表变量为i。这样圈数的范围为:0<=i<(n+1)/2;
4.这样依次处理每一圈,设定变量k=1;向二维变量中存值,每存一个k++;

写出来的程序如下:
public class Test{
        
        public static void main(String[] args) {
                //测试输出 n=4时的情况
                specialPrint(5);
        }
        //定义螺旋输出二维数组的方法。
        public static void specialPrint(int n){
                //定义一个数组,用来存放打印的数据
                int a[][]=new int[n][n];
                //行和列为n时,应该分的圈数。
                int circleNum=(n+1)/2;
                //二维数组的值从1开始
                int k=1;
                //以圈作为外层循环
                for (int i = 0; i<circleNum; i++) {
                        //处理第i圈的上方数据
                        for(int j=i;j<n-i-1;j++)
                                a[j]=k++;
                        //处理第i圈的右方数据
                        for(int j=i;j<n-i-1;j++)
                                a[j][n-i-1]=k++;
                        //处理第i圈的下方数据
                        for(int j=n-i-1;j>i+1;j--)
                                a[n-i-1][j]=k++;
                        //处理第i圈的左方数据。
                        for(int j=n-i-1;j>i+1;j--)
                                a[j]=k++;
                }
                //特殊处理,当n为奇数时,为最内层数据赋值。
                if(n%2==1)a[circleNum-1][circleNum-1]=n*n;
                //打印输出 二维数组
                for (int i = 0; i <n; i++) {
                        for (int j = 0; j < n; j++) {
                                //当a[j]<10,即当为个位数时 数字之打印有两个空格,
                                System.out.print(a[j]+(a[j]>9?" ":"  "));
                        }
                        //换行
                        System.out.println();
                }
               
        }
        
}

运行结果是这样的:

1  2  3  4  5  
0  15 16 17 6  
14 0  25 18 7  
13 20 0  19 8  
12 0  11 10 9  
我觉得我的思路没错 可是就是不知道哪错了
好心人帮着看看吧。我都快疯了



作者: 神之梦    时间: 2013-5-27 00:45
学习了一天,真心累了,会有大神帮你解决的,
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。.......................屌丝云
作者: 周中波    时间: 2013-5-27 10:26
兄弟。。入学测试题都是这般题目吗?我表示鸭梨山大啊!还有很长的一段路要走啊。。
作者: 张甲甲    时间: 2013-5-27 10:29
周中波 发表于 2013-5-27 10:26
兄弟。。入学测试题都是这般题目吗?我表示鸭梨山大啊!还有很长的一段路要走啊。。 ...

这是难得 还是简单的多 淡定点
作者: 周中波    时间: 2013-5-27 10:46
张甲甲 发表于 2013-5-27 10:29
这是难得 还是简单的多 淡定点

谢谢兄弟的回复!你这一句话给了我正能量!奋斗ing~!~ 祝福你早日进黑马!
作者: 石贤芝    时间: 2013-5-27 11:34
本帖最后由 石贤芝 于 2013-5-27 16:37 编辑

要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列,,,

呵呵,看懂了。答案在8楼。。。中午没有认真看。
作者: 石贤芝    时间: 2013-5-27 16:31
本帖最后由 石贤芝 于 2013-5-27 16:32 编辑

兄弟,把处理下方和左方数据的for循环里面判断条件的 “>” 改成 “>=” 就好了,否则下标会少算一个。如下:
  1.                     //处理第i圈的下方数据
  2.                     for(int j=n-i-1;j>=i+1;j--)
  3.                             a[n-i-1][j]=k++;
  4.                     //处理第i圈的左方数据。
  5.                     for(int j=n-i-1;j>=i+1;j--)
  6.                             a[j][i]=k++;
复制代码

作者: 〃Mr.Zぐ    时间: 2013-5-28 12:08
  1. public class Test9 {

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

  13.         }

  14.         int width = 4;// 只能是偶数
  15.         Integer[][] Zone;

  16.         Test9(int p) {
  17.                 this.width = p % 2 == 1 ? p - 1 : p;
  18.                 this.Zone = new Integer[this.width][this.width];
  19.                 this.init(0, 1);
  20.         }

  21.         private void init(int roll, int start) {
  22.                 int wid = this.width - 2 * roll;
  23.                
  24.                 if (wid == 0)
  25.                         return;
  26.                 for (int i = 0; i < wid - 1; i++) {
  27.                         this.Zone[roll][i + roll] = start;
  28.                         start++;
  29.                 }
  30.                 for (int i = 0; i < wid - 1; i++) {
  31.                         this.Zone[i + roll][this.width - 1 - roll] = start;
  32.                         start++;
  33.                 }
  34.                 for (int i = 0; i < wid - 1; i++) {
  35.                         this.Zone[this.width - 1 - roll][this.width - 1 - roll - i] = start;
  36.                         start++;
  37.                 }
  38.                 for (int i = 0; i < wid - 1; i++) {
  39.                         this.Zone[this.width - 1 - roll - i][roll] = start;
  40.                         start++;
  41.                 }
  42.                 init(++roll, start);
  43.         }

  44.         void output() {
  45.                 for (int i = 0; i < this.width; i++) {
  46.                         for (int j = 0; j < this.width; j++) {
  47.                                 System.out.print("\t" + this.Zone[i][j]);
  48.                         }
  49.                         System.out.println();
  50.                 }
  51.         }
  52. }
复制代码

作者: 袁梦希    时间: 2013-5-29 17:01
如果问题已经解决,请把帖子的类型改为已经解决,如果不会解决请看我的个性签名。
作者: 贾俊锋    时间: 2014-5-9 21:39
这是入学测试题么,好像现在还不会,努力吧,




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