回形数格式方阵的实现

回形数格式方阵的实现

从键盘输入一个整数(1~20),则以该数字为矩阵的大小,把1,2,3,4,…… n*n按照顺时针螺旋的形式填入其中。
例如:
输入2:
输出:
1 2
4 3

方法1:

按照题意,用程序螺旋放入,用k来记录方向,m表示放入的数字。i,和j分别是行与列。
在这里插入图片描述

import java.util.Scanner;

public class RectangleTest 
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        System.out.println("输入一个数字");
        int len = in.nextInt();
        int[][] arr = new int[len][len];

        int s = len * len;
        int k = 1;
        int i = 0, j = 0;
        for (int m = 1; m <= s; m++) //m从1开始放入s个
        {
            if (k == 1) 
            {
                if (j < len && arr[i][j] == 0)
                    arr[i][j++] = m;
                else 
                {
                    k = 2;//换方向
                    i++;//i这一行已经放了,所以到下一行
                    j--;//j = len 是跳出的,所以j回退一个
                    m--;//m也回退一个
                }
            } 
            else if (k == 2) 
            {
                if (i < len && arr[i][j] == 0)
                    arr[i++][j] = m;
                else 
                {
                    k = 3;
                    i--;
                    j--;
                    m--;
                }
            } 
            else if (k == 3) 
            {
                if (j >= 0 && arr[i][j] == 0)
                    arr[i][j--] = m;
                else 
                {
                    k = 4;
                    i--;
                    j++;
                    m--;
                }

            } 
            else if (k == 4) 
            {
                if (i >= 0 && arr[i][j] == 0)
                    arr[i--][j] = m;
                else 
                {
                    k = 1;
                    i++;
                    j++;
                    m--;
                }
            }
        }
        for (int[] row : arr) 
        {
            for (int odd : row)
                System.out.printf("%4d", odd);
            System.out.println();
        }
    }
}

在这里插入图片描述

方法2:

这个方法与上一个是同样填入,横为x轴,纵为y轴,但是外层循环条件不同。
用count表示要填入的数字,minX与maxX在填完一圈后的值在接近,直到minX>maxX。相等时,是为了保证奇数行(列)最中间的一个值填入,因为奇数行(列)最后肯定是横着向右输入,此时minX = maxX。

奇数行(列)时,最中间的是那个圆圈,minX = minY = maxX = maxY
在这里插入图片描述

import java.util.Scanner;

public class RetangleTest2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] arr = new int[n][n];

        int count = 0;//要填入的数字
        int maxX = n - 1;//x轴的最大下标
        int maxY = n - 1;//y轴的最大下标
        int minX = 0;//x轴的最小下标
        int minY = 0;//y轴的最大下标
        while (minX <= maxX) //也可以写成minY <= maxY
        {
            for (int x = minX; x <= maxX; x++) 
            {
                arr[minY][x] = ++count;
            }
            minY++;
            for (int y = minY; y <= maxY; y++) 
            {
                arr[y][maxX] = ++count;
            }
            maxX--;
            for (int x = maxX; x >= minX; x--) 
            {
                arr[maxY][x] = ++count;
            }
            maxY--;
            for (int y = maxY; y >= minY; y--) 
            {
                arr[y][minX] = ++count;
            }
            minX++;
        }
        for (int m = 0; m < arr.length; m++) 
        {
            for (int j = 0; j < arr[m].length; j++)
                System.out.printf(arr[m][j] + "\t");
            System.out.println();
        }
    }
}

在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页