zoukankan      html  css  js  c++  java
  • 回形数格式方程的实现

    题目描述

    从键盘输入一个整数(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.顺时针打印矩阵

  • 相关阅读:
    svn自动部署
    【阿里云】Windows2008 FTP配置指南
    thinkphp 3.2多语言设置
    iphone、ipod Touch、ipad触屏时的js事件
    Nginx区分PC或手机访问不同网站
    Nginx Location配置总结及基础最佳实践
    阿里云官方教程 Linux 系统挂载数据盘
    利用php调用so库文件中的代码
    LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
    Android深入理解Context(三)Context完全解析
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13675934.html
Copyright © 2011-2022 走看看