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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马IT学员 中级黑马   /  2014-1-10 21:44  /  1469 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;

import java.util.Scanner;

public class Test9 {
        /**    写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:  
         * 1   2   3   4
         * 12  13  14  5
         * 11  16  15  6
         * 10  9   8   7
         */
        public static void main(String[] args) {
                //获取键盘扫描
                Scanner scanner=new Scanner(System.in);
               
                System.out.println("请输入要输出(X*X)的矩阵数字:");
                //获取键盘输入的数据
                String vuale=scanner.next();
       
                //用于匹配数字字符的表达式
                String regex="^[0-9]*$";
                if(vuale.matches(regex))
                {
                        //建数字字符转换成数值类型
                        int len=Integer.valueOf(vuale);
                        //输出矩阵
                        ScreenPrint(len);
                }else
                {
                        System.out.println("只能输入数字字符");
                }
               

        }
       
        /**
         * 这一题的解决思路是,记录每一次转弯的点,并更改其数组的行坐标,和列坐标,
         * 给数组的赋值顺序是按照,现从右走---->在向下走----->之后向左走----->最后向上走
         * 在赋值过程中,记录走过的圈数,因为要更改赋值的走向,以及数组的下标的更改,都需要通过行走的圈数来做出判断
         * @param len
         */
        public static void ScreenPrint(int len)
        {
                int row=0;//数组的行下标值
                int col=0;//数组的列下标
                int right=1;//向右走
                int down=2;//向下走
                int left=3;//向左走
                int up=4;//向上走
                int count=1;//数值的累加器
                int circle=1;//表示走的第几卷
                int number[][]=new int[len][len];
                int direct=right;//刚开始默认也是必须得从右开始行走的
                while(count<=len*len)
                {
                        number[row][col]=count;
                        count++;
                        if(direct==right)
                        {
                                //如果数组的列下标小于数组的长度减1,因为数组的下标是从零开始的,所以要减走的圈数
                                if(col<len-circle)
                                {
                                        col++;//向右走,行坐标是不变的,列坐标是要递增的
                                }else
                                {
                                        direct=down;//将走向转为向下
                                        row++;//因为向下走,数组的行坐标就需要递增一行,也就是转到下一行
                                }
                               
                        }else if(direct==down)
                        {
                                if(row<len-circle)
                                {
                                        row++;//向下走,列坐标是不变的,行坐标是要递增的
                                }else
                                {
                                        direct=left;//最后一行之后需要把走向转到向左走
                                        col--;//转到上一个数的前列,行坐标是不变的列坐标需要递减的
                                }
                        }else if(direct==left)
                        {
                                //这里变得判断为什么是圈数减1呢?是如果是第一圈的话,值是不会出错的,第二圈之后就出问题了,他会把之前的数据覆盖的
                                if(col>circle-1)
                                {
                                        col--;//向左走,行坐标不变,列坐标需要递减
                                }else
                                {
                                        direct=up;//把方向改为向上
                                        row--;//向左,列坐标不变,行坐标需要递减,并且把指向同一列的上一个
                                }
                        }else if(direct==up)
                        {
                                if(row>circle)
                                {
                                        row--;//向上走,列坐标不变,行坐标需要递减
                                }else
                                {
                                        circle++;//走完一圈之后,增1
                                        direct=right;//方向在从右开始,继续下一圈
                                        col++;
                                }
                        }       
                       
                }
                System.out.println("输出结果为:");
                //输出数组中的数据
                for (int i = 0; i < len; i++) {
                        for (int j = 0; j <len; j++) {
                                System.out.print(number[i][j]+"\t");
                        }
                        System.out.println();
                }
        }

}


评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马