Java螺旋数组

 生活终于对我这只小猫咪下手了。

让我们敲几行代码提提神,压压惊。

让我们先来认识一下什么是螺旋数组。

形如 这种 按顺序输入的二维数组,会以顺时针螺旋排列 输出。

我们现在希望输入一个整数 n ,建立一个 n x n 的螺旋数组并输出。

例如 我们输入3 输出

 OK,让我们开始分析一下。

每一次放入数组的顺序数字很好实现,每次加一即可。

难点在于放入数组的数字需要拐弯,这样放入的顺序问题。

对于这样的问题,我们可以定义一个变量,让他表示放入数字的方向,

观察可得到我们每个螺旋数组都是先向右创建,再向下创建

在这里我们使用 0代表向下 , 1代表向左 , 2代表向上 , 3代表向右,每次改变,这个变量加一取余

我们在以4x4的螺旋数组为例子分析。

 我们可以认为,在创建的第一步,将第一行的4个数字( 1,2,3,4)输出;第二步,输出第四列的3个数字(5,6,7);第三步,打印第4行的3个数字(8,9,10);第四步,打印第一列的2个数字(11,12);第五步,打印第2行的两个数字(13,14);第六步打印第3列的1个数字(15);第七部打印第3行的一个数字(16)。

对以上过程进行总结规律,可以得出,在第一步的时候,向右打印n个数字,第二步第三步,向下和向左的分别打印 n -1 个数字,第四步第五步,向上向右分别打印 n-2 个数字。 将第一步除外,向下和向左打印的数字个数一样,,向上和向右打印的数字个数一样。由此我们可以码出一个类。

class Liule {
    
    void setMap(int e) {
        int [][]arr = new int [e][e];
        int ne = e-1,te = e;
        int i = 0,j = e-1;
        int dir = 1;//方向变量
        int count = 1;//打印的数字
        int c = e*e;//数组的总元素个数。
        while(te!=0)
        {
             arr[i][e-(te--)] = count++;
        }
        te = ne;

        while(count<= c) {
            switch(dir) {
            case 0 :
                while(te!=0) {
                    te--;
                    j++;
                    arr[i][j] = count++;
                   
                }
          
                dir = (dir+1)%4;
                ne--;
                te = ne;
                break;
            case 1:
                while(te!=0) {
                    te--;
                    i++;
                    arr[i][j] = count++;
                }

                dir = (dir+1)%4;
                te = ne;
                break;
            case 2:
                while(te!=0) {
                    te--;
                    j--;
                    arr[i][j] = count++;
                }

                dir = (dir+1)%4;
                ne--;
                te = ne;
                break;   
            case 3:
                while(te!=0) {
                    te--;
                    i--;
                    arr[i][j] = count++;
                }

                dir = (dir+1)%4;
                te = ne;
                break;
            default:
                break;
            }
            
            
        }
        
       for(i=0;i<e;i++) {
           for(j=0;j<e;j++) {
               System.out.print(arr[i][j]+"  ");
           }
               System.out.println("");
       }
       
    }
    
}

在这段代码里定义了 te 和 ne 用来遏制螺旋打印重叠的情况 和 用于数组边长的储存。

之后直接在main函数里调用。完整代码如下

package com.zzu.hw;

import java.util.Scanner;

public class Hw81500 {
    public static void main(String[] args) {
        Liule ane = new Liule();
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入螺旋数组的大小");
        int n = scan.nextInt();
        ane.setMap(n);
    }
}

class Liule {
    
    void setMap(int e) {
        int [][]arr = new int [e][e];
        int ne = e-1,te = e;
        int i = 0,j = e-1;
        int dir = 1;
        int count = 1;
        int c = e*e;
        while(te!=0)
        {
             arr[i][e-(te--)] = count++;
        }
        te = ne;
        while(count<= c) {
            switch(dir) {
            case 0 :
                while(te!=0) {
                    te--;
                    j++;
                    arr[i][j] = count++;
                   
                }
          
                dir = (dir+1)%4;
                ne--;
                te = ne;
                break;
            case 1:
                while(te!=0) {
                    te--;
                    i++;
                    arr[i][j] = count++;
                }

                dir = (dir+1)%4;
                te = ne;
                break;
            case 2:
                while(te!=0) {
                    te--;
                    j--;
                    arr[i][j] = count++;
                }

                dir = (dir+1)%4;
                ne--;
                te = ne;
                break;   
            case 3:
                while(te!=0) {
                    te--;
                    i--;
                    arr[i][j] = count++;
                }

                dir = (dir+1)%4;
                te = ne;
                break;
            default:
                break;
            }
            
            
        }
        
       for(i=0;i<e;i++) {
           for(j=0;j<e;j++) {
               System.out.print(arr[i][j]+"  ");
           }
               System.out.println("");
       }
       
    }
    
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值