• 回形数格式方程的实现


    题目描述

    从键盘输入一个整数(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

    解法1(参考顺时针打印矩阵):

    public class test{
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入一个数字");
            int num = scanner.nextInt();
            // 行和列都是num
            int cols = num;
            int rows = num;
            // 创建二维数组
            int[][] arr = new int[rows][cols];
            // 初始化边界
            int c1 = 0, c2 = cols - 1;
            int r1 = 0, r2 = rows - 1;
            // 计算打几圈,奇数需要加1圈
            int times = (Math.min(cols,rows) & 1) == 0 ? Math.min(cols,rows) / 2 : Math.min(cols,rows) / 2 + 1;
            int n = 1; // 需要赋值的数
            for (int time = 0; time < times; time++) {
                //
                for (int i = c1; i <= c2; i++) arr[r1][i] = n++;
                //
                for (int i = r1 + 1; i <= r2; i++) arr[i][c2] = n++;
                // 考虑边界,例如最后一圈只有一行(r1=r2),只有一列(c1=c2);如果不加限制,会重复向左打印或者重复向上打印
                if (c1 != c2 && r1 != r2){
                    //
                    for (int i = c2 - 1; i >= c1; i--) arr[r2][i] = n++;
                    //
                    for (int i = r2 - 1; i > r1; i--) arr[i][c1] = n++;
                }
                c1++;
                c2--;
                r1++;
                r2--;
            }
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[0].length; j++) {
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
        }
    }

    解法2(参考康师傅,与解法1相比,不需要计算圈数!!!)

    public class test{
        public static void main(String[] args) {
            int n = 7;
            int[][] arr = new int[n][n];
            int count = 0; // 需要赋值的数
            int c1 = 0, c2 = n - 1;
            int r1 = 0, r2 = n - 1;
            while (c1 <= c2){
                for (int i = c1; i <= c2; i++) arr[r1][i] = ++count;
                for (int i = r1 + 1; i <= r2; i++) arr[i][c2] = ++count;
                for (int i = c2 - 1; i >= c1 ; i--) arr[r2][i] = ++count;
                for (int i = r2 - 1; i > r1; i--) arr[i][c1] = ++count;
                c1++;
                c2--;
                r1++;
                r2--;
            }
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[0].length; j++) {
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
        }
    }

    举一反三:

    剑指19.顺时针打印矩阵

  • 相关阅读:
    20201029-1 每周例行报告
    20201022-1 每周例行报告
    20201015-3 每周例行报告
    作业要求 20201008-1 每周例行报告
    《机器学习》第二次作业——第四章学习记录和心得
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    实验 3:Mininet 实验——测量路径的损耗率
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13675934.html
Copyright © 2020-2023  润新知