亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實現(xiàn)的按照順時針或逆時針方向輸出一個數(shù)字矩陣功能示例

 更新時間:2018年01月10日 12:15:17   作者:捏造的信仰  
這篇文章主要介紹了Java實現(xiàn)的按照順時針或逆時針方向輸出一個數(shù)字矩陣功能,涉及java基于數(shù)組遍歷、運算的矩陣操作技巧,需要的朋友可以參考下

本文實例講述了Java實現(xiàn)的按照順時針或逆時針方向輸出一個數(shù)字矩陣功能。分享給大家供大家參考,具體如下:

題目:按照指定的長寬和輸出方向,從外向內(nèi)打印一個從 1 開始的數(shù)字矩陣,矩陣的開始位置在左上角。如下圖

代碼及注釋如下:

public class NumberMatrix {
  public static void main(String[] args) {
    int width = 25;
    int height = 12;
    boolean clockwise = false;
    System.out.println("腳本之家測試結(jié)果:");
    outputMatrix(width, height, clockwise);
  }
  /**
   * 按照指定的長寬和輸出方向,從外向內(nèi)打印一個從 1 開始的數(shù)字矩陣,矩陣的開始位置在左上角。
   *
   * @param width   矩陣寬度
   * @param height  矩陣高度
   * @param clockwise 是否是順時針方向
   */
  private static void outputMatrix(int width, int height, boolean clockwise) {
    // 首先判斷最大數(shù)字的位數(shù),以決定輸出如何對齊
    int numLength = (int) Math.log10(width * height) + 1;
    // 決定輸出的格式(最大位數(shù) + 1個空格)
    String format = "%" + (numLength + 1) + "d";
    // 定義要輸出的二維數(shù)組,注意維度是從高到低的
    // 此時 matrix 中所有元素的值都是 0
    int[][] matrix = new int[height][width];
    // 定義一個位置指針和一個計數(shù)器,位置指針進行移動,而計數(shù)器負責遞增,遞增后的數(shù)字
    // 被填充進矩陣,當 width * height 個數(shù)字填充完畢,這個矩陣就完成了。
    // 注意這里位置指針的第一個元素對應(yīng) matrix 的第一個維度 y,第二個元素對應(yīng)第二個維度 x。
    int[] pointer = {0, 0};
    int counter = 1;
    // 定義當前移動的方向:1、2、3、4 分別表示上、右、下、左。
    // 順時針的起始方向為右,逆時針的起始方向為下。
    int direction = clockwise ? 2 : 3;
    // 開始循環(huán)填充,每個填充分為三步
    for (int i = 1, max = width * height; i <= max; i++) {
      // 1. 填充內(nèi)容
      int y = pointer[0];
      int x = pointer[1];
      matrix[y][x] = counter;
      // 2. 計數(shù)器自增
      counter += 1;
      // 3. 移動到下一個位置,因為這地方比較復雜,所以開個方法實現(xiàn)
      direction = move(matrix, width, height, pointer, direction, clockwise);
    }
    // 矩陣填充完畢,按照正常的方式循環(huán)輸出即可
    for (int y = 0; y < height; y++) {
      for (int x = 0; x < width; x++) {
        System.out.printf(format, matrix[y][x]);
      }
      System.out.println(); // 完成一行后輸出換行
    }
  }
  /**
   * 在矩陣中移動
   *
   * @param matrix  矩陣,用于判斷前進方向的下一個位置是否已經(jīng)填充了數(shù)字,如果是則轉(zhuǎn)向
   * @param width   矩陣的寬
   * @param height  矩陣的高
   * @param pointer  指針的當前位置。調(diào)用本方法后里面的值會改變,除非方法返回 0
   * @param direction 指針當前移動的方向
   * @param clockwise 是否是要按順時針方向轉(zhuǎn)向
   *
   * @return 移動后的新方向(與原來的方向可能相同也可能不同)。如果無法再繼續(xù)移動,則返回 0
   */
  private static int move(int[][] matrix, int width, int height, int[] pointer, int direction, boolean clockwise) {
    // 先嘗試按照原來的方向移動到 newPointer
    int[] newPointer = moveDirectly(pointer, direction);
    // 檢查 newPointer 是否合法,如果合法則將其賦值給 pointer 并保持原來的方向,方法完成
    if (isValid(newPointer, matrix, width, height)) {
      System.arraycopy(newPointer, 0, pointer, 0, 2);
      return direction;
    }
    // 進行轉(zhuǎn)向,重新從 pointer 朝新的方向移動
    direction = turn(direction, clockwise);
    newPointer = moveDirectly(pointer, direction);
    // 檢查 newPointer 是否合法(同前面一樣)
    if (isValid(newPointer, matrix, width, height)) {
      System.arraycopy(newPointer, 0, pointer, 0, 2);
      return direction;
    }
    // 既無法前進也無法轉(zhuǎn)向,那么無法繼續(xù)移動。
    return 0;
  }
  // 判斷矩陣中指定的位置是否可以填充
  private static boolean isValid(int[] newPointer, int[][] matrix, int width, int height) {
    // 位置不能超出矩陣范圍
    if (newPointer[0] >= height
        || newPointer[0] < 0
        || newPointer[1] >= width
        || newPointer[1] < 0) {
      return false;
    }
    // 位置的內(nèi)容應(yīng)該為空
    if (matrix[newPointer[0]][newPointer[1]] != 0) {
      return false;
    }
    return true;
  }
  // 轉(zhuǎn)向。根據(jù)我們對 direction 的定義,順時針就是 +1,逆時針就是 -1
  private static int turn(int direction, boolean clockwise) {
    int newDirection = clockwise ? 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);
  }
}

運行結(jié)果:

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計有所幫助。

相關(guān)文章

  • springboot使用外置tomcat啟動方式

    springboot使用外置tomcat啟動方式

    這篇文章主要介紹了springboot使用外置tomcat啟動方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot整合LDAP的流程分析

    SpringBoot整合LDAP的流程分析

    這篇文章主要介紹了SpringBoot整合LDAP的流程分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • 深入學習java位運算的基礎(chǔ)知識

    深入學習java位運算的基礎(chǔ)知識

    位運算是直接對整數(shù)在內(nèi)存中的二進制位進行操作嗎,位運算即可以節(jié)約內(nèi)存,同時使程序速度更快效率更高。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來一起學習下吧
    2019-06-06
  • 實現(xiàn)一個簡單Dubbo完整過程詳解

    實現(xiàn)一個簡單Dubbo完整過程詳解

    這篇文章主要為大家介紹了實現(xiàn)一個簡單Dubbo完整過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實現(xiàn)

    SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實現(xiàn)

    這篇文章主要介紹了SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringMVC中的handlerMappings對象用法

    SpringMVC中的handlerMappings對象用法

    這篇文章主要介紹了SpringMVC中的handlerMappings對象用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • fastjson對JSONObject中的指定字段重新賦值的實現(xiàn)

    fastjson對JSONObject中的指定字段重新賦值的實現(xiàn)

    這篇文章主要介紹了fastjson對JSONObject中的指定字段重新賦值的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java基礎(chǔ)MAC系統(tǒng)下IDEA連接MYSQL數(shù)據(jù)庫JDBC過程

    Java基礎(chǔ)MAC系統(tǒng)下IDEA連接MYSQL數(shù)據(jù)庫JDBC過程

    最近一直在學習web項目,當然也會涉及與數(shù)據(jù)庫的連接這塊,這里就總結(jié)一下在IDEA中如何進行MySQL數(shù)據(jù)庫的連接,這里提一下我的電腦是MAC系統(tǒng),使用的編碼軟件是IDEA,數(shù)據(jù)庫是MySQL
    2021-09-09
  • Spring Boot 端口被占用的解決方法

    Spring Boot 端口被占用的解決方法

    這篇文章主要介紹了解決 Spring Boot 端口被占用的方法詳解,通過本文的介紹,你學習了如何解決 Spring Boot 端口被占用的問題。你了解了檢查端口是否被占用、停止占用端口的進程、更改應(yīng)用程序的端口號以及檢查應(yīng)用程序間的端口沖突等方法,需要的朋友可以參考下
    2023-07-07

最新評論