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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Chans_宇 中级黑马   /  2015-4-26 18:20  /  575 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

昨晚看了个贴是有关螺旋方阵的,链接:http://bbs.itheima.com/thread-189202-1-1.html,于是乎自己也回去研究了一下,下午赶出来了,和大家分享一下

import java.util.Scanner;

public class FangZhenTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                // 手动输入定义方阵的长和宽的值,长和宽的长度一致为n
                System.out.println("请输入一个正整数:");
                Scanner sc = new Scanner(System.in);
                int n = sc.nextInt();
                // 定义二位数组
                int[][] arr = new int[n][n];
                // 定义数组坐标,x为横向坐标,y为竖向坐标,
                int x, y;
                // 定义总共需要循环的层数
                int m = (n+1)/ 2;
                // 定义累加器
                int count = 0;
                // 定义循环起始值z为0()
                for (int z = 0; z < m; z++) {
                        // 当z=0时,第一次循环开始
                       //从(0,0)坐标开始,x值固定,到(0,n-1)坐标遍历累加赋值给对应数组坐标,第二层从(1,1)到(1,n-1)以此类推。
                        for (x = z, y = x; y < n -z; y++) {
                                arr[x][y] = ++count;
                        }
                        count--;
                        // 从(0,n-1)坐标开始,y值固定,到(n-1,n-1)坐标遍历递加赋值给对应数组坐标,第二层从(1,n-2)到(n-2,n-2)以此类推。
                        for (y = n - z-1 , x = z; x < n- z; x++) {
                                arr[x][y] = ++count;
                        }
                        count--;
                        //从(n-1,n-1)坐标开始,x值固定,到(n-1,0)坐标,y值递减遍历赋值给对应数组坐标,第二层。。。类推
                        for (x = n - z -1, y = x; y >=z; y--) {
                                arr[x][y] = ++count;
                        }
                        count--;
                       //从(n-1,0)坐标开始,y值固定,到(1,0)坐标,x值递减遍历赋值给对应数组坐标,第二层。。。类推
                        for (y = z, x =n-z-1; x >=z+1; x--) {
                                arr[x][y] = ++count;
                        }
                }
                // 遍历输出数组
                System.out.println("你要打印的螺旋方阵如下:");
                for (x = 0; x < n; x++) {
                        for (y = 0; y < n; y++) {
                                System.out.print(arr[x][y] + "\t");
                        }
                        System.out.println();
                }
        }
}
  说一下自己的感受吧,主体思想是用二维数组标记空间坐标,建立一个累加器,使用for的嵌套循去操作累加的数据在螺旋数据结构体中遍历赋值,遍历打印输二维数组就行了,这个题目其实之前在看视频课的时候有作为一个扩展题看过,也理过思路,大概知道思考方向没去深究,因为本人觉得既然Java是一门面向对象的编程语言,其实许多实现方法我们是并不需要太过去纠结,我觉得毕竟每个人的精力都是有限的,不知道大家有没有看过火影这部动漫,虽然后面收尾狗血得有点惨不忍睹,但里面的一个人物我一直很是喜欢的,没错,是鼬,他说过每个每个人都有自己器量,只有不断测试自己的器量才能更好地给自己定位,作为初学者的我觉得还是老老实实先打好基础再说,没必要特意耗费过多的精力到那些偏难冷门的题解去,谨记一点:我们学习知识是为了开拓未来的,并不是为了损耗自身!再拿如今高精度集成电路来说吧,虽然我们明白他们底几乎都是以二进制数字电路形式实现,但具体到每一步如何实现是几乎不敢想象的,上午写出来的时候,有个坐标遍历时提示索引越界错误,调了许久都没找到原因,特烦躁,脑子都有点炸设为感觉,虽然最后还是弄出来了,但觉得好累,也浪费了大半天时间没好好学习。。。说句实话,其实我也是比较喜欢转牛角尖的人不然也不会叨这么多话了:L。。。好吧,大家一起努力~为我们心中的梦想{:3_63:}

5 个回复

倒序浏览
当经理的也是从小职员走过的人。
做做难题其实也没什么不对。我也承认确实比较好时间耗精力。
回复 使用道具 举报
1017161726 发表于 2015-4-26 18:44
当经理的也是从小职员走过的人。
做做难题其实也没什么不对。我也承认确实比较好时间耗精力。 ...

嗯,其实关于x和y坐标是可以用循环次数m和方阵的长度n的关系去确定,这样一弄我估计许多人会懵,因为这种变量值替换像是递归了吧,:L,这样写更容易让人理解,我只是希望大家都能明确定位,更好地学习:lol
回复 使用道具 举报
依秋无泪 来自手机 中级黑马 2015-4-30 12:24:03
板凳
说的很好,我是因为基础都学的差不多了,也不会在螺旋矩阵花太多时间,但是学到面向对象后,为了锻炼自己的面向对象思想,就想把思路用面向对象的方法表达出来,有可能学到集合的时候还会用集合把这题拿出来做下
回复 使用道具 举报
依秋无泪 发表于 2015-4-30 12:24
说的很好,我是因为基础都学的差不多了,也不会在螺旋矩阵花太多时间,但是学到面向对象后,为了锻炼自己的 ...

嗯嗯,加油~
回复 使用道具 举报
说的对呀  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马