数组题型:回形数

发布于:2023-01-04 ⋅ 阅读:(177) ⋅ 点赞:(0)

回形数格式方阵的实现
从键盘输入一个整数(1~20) 
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出: 1 2 
4 3 
输入数字3,则程序输出: 1 2 3 
8 9 4 
7 6 5 
输入数字4, 则程序输出: 
1   2   3   4 
12  13  14  5 
11  16  15  6 
10   9  8    7
 

方法一:

import java.util.Scanner;
public class hello {
    static int[][] a;
    static int num;
    static int init=1;
    static  int i = 0, j = 0;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        num = scan.nextInt();
        a = new int[num+1][num+1];
        a[0][0]=1;

        while (true) {
            if (direction(i, j) == 5) {
                break;
            }
            else{
                move(direction(i,j));
            }

        }
        for(int z=0;z<num;z++)
        {
            for(int k=0;k<num;k++)
            {
                System.out.print(a[z][k]+" ");
            }
            System.out.println("");
        }
    }

    public static int direction(int i, int j) {
        if (j + 1 < num && a[i][j + 1] == 0) {
            return 1;
        } else if (i + 1 < num && a[i+1][j] == 0) {
            return 2;
        } else if (j - 1 >= 0 && a[i][j-1] == 0) {
            return 3;
        } else if (i - 1 >= 0 && a[i-1][j] == 0) {
            return 4;
        } else {
            return 5;
        }

    }
    public static int move(int x)
    {
        if(x==1)
        {
            while(j+1<num&&a[i][j+1]==0)
            {
                j++;
                init++;
                a[i][j]=init;
            }
            return 0;
        }
        else if(x==2)
        {
            while(i+1<num&&a[i+1][j]==0)
            {
                i++;
                init++;
                a[i][j]=init;
            }
            return 0;
        }
        else if(x==3)
        {
            while(j-1>=0&&a[i][j-1]==0)
            {
                j--;
                init++;
                a[i][j]=init;
            }
            return 0;
        }
        else if(x==4)
        {
            while(i-1>=0&&a[i-1][j]==0)
            {
                i--;
                init++;
                a[i][j]=init;
            }
            return 0;
        }
        return 0;
    }
}

运行结果:

方法二:

import java.util.Scanner;
public class hello {
    public static void main(String[] args)
    {

        Scanner scan=new Scanner(System.in);
        int num=scan.nextInt();
        int[][] a=new int[num][num];
        int mini=0,minj=0;
        int maxi=num-1,maxj=num-1;
        int data=0;
        while(mini<=maxi&&minj<=maxj)
        {
            for(int x=minj;x<=maxj;x++)
            {
                a[mini][x]=++data;
            }
            mini++;
            for(int x=mini;x<=maxi;x++)
            {
                a[x][maxj]=++data;
            }
            maxj--;
            for(int x=maxj;x>=minj;x--)
            {
                a[maxi][x]=++data;

            }
            maxi--;
            for(int x=maxi;x>=mini;x--)
            {
                a[x][minj]=++data;
            }
            minj++;
        }
        for(int i=0;i<num;i++)
        {
            for(int j=0;j<num;j++)
            {
                System.out.print(a[i][j]+" ");
            }
            System.out.println("");
        }
    }
}

运行结果:

 显然第二种比第一种更优,第二种主要聚焦与maxi,maxj,mini,minj,以及根据每一次的初始化更新它们的值,来达到跳出循环的目的


网站公告

今日签到

点亮在社区的每一天
去签到