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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

题目:遍历一个等长的二维数组,要求从外围的圈在打印里面的圈,比如这样一个二维数组
1 2 3 4              
12 13 14 5
11 16 15 6
10 9 8 7
打印的值是1到16

2 个回复

正序浏览
import java.util.*;
class Test3
{
        public static void main(String[] args)
        {       
       
                Scanner sc = new Scanner(System.in);//获取键盘输入
                int n=sc.nextInt();
                tryy(n);
               
               
        }
        //判断键盘输入是否符合要求,不要求抛出异常
        public static void tryy(int n)
        {
                try {   
                                int num=Integer.valueOf(n);
                                if(n==1)
                                        System.out.println(1);
                                else Num(n);
                        }
                catch (Exception e)
                        {  
                                System.out.print("输入类型错误,请输入正整数");
                        }
        }
        //用存入的正整数建立长度为n*n一维数组
        public static void Num(int n)
        {
                int []a=new int [n*n];
                for (int x=0;x<n ;x++ )
                {
                        for (int y=0;y<n ;y++ )
                        {
                                a[n*x+y]=x*n+y+1;
                        }
                }
                ScrewArray(a,n);

        }
        //打印二维数组
        public static void Printer(int [][]a,int n)
        {
                for (int x=0;x<n ;x++ )
                {
                        for (int y=0;y<n ;y++ )
                        {
                                System.out.print(a[x][y]+"\t");
                                if (y==n-1)
                                {
                                        System.out.println();
                                }
                        }
                }
        }
        //将二维数组的值按要求排列放入新二维数组x[a][b],a=b=n-1
        public static void ScrewArray(int []y,int n)
        {
                int [][]x=new int[n][n];
                int i=0;
                Out:for(int m=0;i<=n*n-1;m++)
                {
                        int a=m;
                        int b=m;
                        //第一行 a=0,b=0--->>> b++ --->>> b=n-2(留b=n-1做最后一类的第一个数x[0][n-1])
                        while (b<n-1-m)
                        {
                                x[a][b]=y[i];
                                if (i==n*n-1)
                                        break Out;
                                b++;
                                i++;
                        }
                        //最后一列 b=n-1,a=0--->>> a++ --->>> a=n-2(留a=n-1做最后一行的第一个数x[n-1][n-1])
                        while (a<n-1-m)
                        {
                               
                                x[a][b]=y[i];
                                if (i==n*n-1)
                                        break Out;
                                a++;
                                i++;
                        }
                        /*
                        最后一行,a=n-1;b=n-1 --->>> b-- --->>> b=1(留b=0做第一列的第一个数x[n-1][0])
                        */
                        while (b>0+m)
                        {

                                x[a][b]=y[i];
                                if (i==n*n-1)
                                        break Out;
                                b--;
                                i++;
                        }
                        /*
                        最后一行,b=0;a=n-1 --->>> a-- --->>> a=1(留a=0在第一行已经被使用)
                        */
                        while (a>0+m)
                        {

                                x[a][b]=y[i];
                                if (i==n*n-1)
                                        break Out;
                                a--;
                                i++;
                        }
                        //一维数组n*n-1角标出现,循环结束
                        if(i==n*n-1)
                        {
                                x[a+1][b+1]=y[i];
                                break Out;
                        }
       
                }       
                Printer(x,n);

        }
}

运行后输入4,回车,可以完成你这个。
我这个程序是使用所有正整数的,如果你只需要4,请在主函数里面将n定义成4,同时删掉tryy()即可
回复 使用道具 举报
不好意思,好像看不懂你的题目意思
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马