热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

Java实现的按照顺时针或逆时针方向输出一个数字矩阵功能示例

这篇文章主要介绍了Java实现的按照顺时针或逆时针方向输出一个数字矩阵功能,涉及java基于数组遍历、运算的矩阵操作技巧,需要的朋友可以参考下

本文实例讲述了Java实现的按照顺时针或逆时针方向输出一个数字矩阵功能。分享给大家供大家参考,具体如下:

题目:按照指定的长宽和输出方向,从外向内打印一个从 1 开始的数字矩阵,矩阵的开始位置在左上角。如下图

代码及注释如下:

public class NumberMatrix {
  public static void main(String[] args) {
    int width = 25;
    int height = 12;
    boolean clockwise = false;
    System.out.println("测试结果:");
    outputMatrix(width, height, clockwise);
  }
  /**
   * 按照指定的长宽和输出方向,从外向内打印一个从 1 开始的数字矩阵,矩阵的开始位置在左上角。
   *
   * @param width   矩阵宽度
   * @param height  矩阵高度
   * @param clockwise 是否是顺时针方向
   */
  private static void outputMatrix(int width, int height, boolean clockwise) {
    // 首先判断最大数字的位数,以决定输出如何对齐
    int numLength = (int) Math.log10(width * height) + 1;
    // 决定输出的格式(最大位数 + 1个空格)
    String format = "%" + (numLength + 1) + "d";
    // 定义要输出的二维数组,注意维度是从高到低的
    // 此时 matrix 中所有元素的值都是 0
    int[][] matrix = new int[height][width];
    // 定义一个位置指针和一个计数器,位置指针进行移动,而计数器负责递增,递增后的数字
    // 被填充进矩阵,当 width * height 个数字填充完毕,这个矩阵就完成了。
    // 注意这里位置指针的第一个元素对应 matrix 的第一个维度 y,第二个元素对应第二个维度 x。
    int[] pointer = {0, 0};
    int counter = 1;
    // 定义当前移动的方向:1、2、3、4 分别表示上、右、下、左。
    // 顺时针的起始方向为右,逆时针的起始方向为下。
    int direction = clockwise ? 2 : 3;
    // 开始循环填充,每个填充分为三步
    for (int i = 1, max = width * height; i <= max; i++) {
      // 1. 填充内容
      int y = pointer[0];
      int x = pointer[1];
      matrix[y][x] = counter;
      // 2. 计数器自增
      counter += 1;
      // 3. 移动到下一个位置,因为这地方比较复杂,所以开个方法实现
      direction = move(matrix, width, height, pointer, direction, clockwise);
    }
    // 矩阵填充完毕,按照正常的方式循环输出即可
    for (int y = 0; y = height
        || newPointer[0] <0
        || newPointer[1] >= width
        || newPointer[1] <0) {
      return false;
    }
    // 位置的内容应该为空
    if (matrix[newPointer[0]][newPointer[1]] != 0) {
      return false;
    }
    return true;
  }
  // 转向。根据我们对 direction 的定义,顺时针就是 +1,逆时针就是 -1
  private static int turn(int direction, boolean clockwise) {
    int newDirection = clockwise &#63; direction + 1 : direction - 1;
    if (newDirection > 4) {
      newDirection = 1;
    } else if (newDirection <1) {
      newDirection = 4;
    }
    return newDirection;
  }
  /**
   * 朝指定的方向移动,并返回新的位置
   *
   * @param pointer  当前位置
   * @param direction 方向
   *
   * @return 新的位置
   */
  private static int[] moveDirectly(int[] pointer, int direction) {
    int y = pointer[0];
    int x = pointer[1];
    switch (direction) {
      case 1:
        return new int[]{y - 1, x};
      case 2:
        return new int[]{y, x + 1};
      case 3:
        return new int[]{y + 1, x};
      case 4:
        return new int[]{y, x - 1};
    }
    throw new IllegalArgumentException("方向不正确: " + direction);
  }
}

运行结果:

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


推荐阅读
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 深入解析RDMA中的队列对(Queue Pair)
    本文将详细探讨RDMA架构中的关键组件——队列对(Queue Pair,简称QP),包括其基本概念、硬件与软件实现、QPC的作用、QPN的分配机制以及用户接口和状态机。通过这些内容,读者可以更全面地理解QP在RDMA通信中的重要性和工作原理。 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • Android Studio 中查看应用程序崩溃日志的方法
    本文介绍如何在 Android Studio 中配置环境变量并使用 ADB 工具查看应用程序的崩溃日志,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文将继续探讨前端开发中常见的算法问题,重点介绍如何将多维数组转换为一维数组以及验证字符串中的括号是否成对出现。通过多种实现方法的解析,帮助开发者更好地理解和掌握这些技巧。 ... [详细]
  • 如何使用 CleanMyMac X 2023 激活码解锁完整功能
    本文详细介绍了如何使用 CleanMyMac X 2023 激活码解锁软件的全部功能,并提供了一些优化和清理 Mac 系统的专业建议。 ... [详细]
  • 解决MacOS上Android Studio Gradle版本不匹配问题
    在MacOS系统中,升级Android Studio后可能会遇到Gradle版本不兼容的问题。当网络下载更新受阻时,可以使用本地已安装的Gradle版本来解决问题。本文将详细介绍如何配置本地Gradle环境以确保开发工作的顺利进行。 ... [详细]
  • Go语言实现经典排序算法:归并排序
    本文介绍如何使用Go语言实现经典的归并排序算法,探讨其原理、代码实现及性能特点。适合Golang开发者和编程爱好者。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 算法稳定币:构建去中心化加密货币体系的新希望
    本文探讨了算法稳定币在加密经济中的潜力,分析其与传统稳定币及比特币等早期加密资产的区别,并展望其未来发展方向。随着DeFi的兴起,算法稳定币正逐渐成为实现中本聪最初愿景的关键角色。 ... [详细]
author-avatar
kkka姐姐_244
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有