基礎練習 回形取數

基礎練習 回形取數

@藍橋杯 基礎練習 BASIC-25

問題描述
  回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉90度。一開始位於矩陣左上角,方向向下。
輸入格式
  輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。
輸出格式
  輸出只有一行,共mn個數,爲輸入矩陣回形取數得到的結果。數之間用一個空格分隔,行末不要有多餘的空格。
  
樣例輸入

3 3
1 2 3
4 5 6
7 8 9

樣例輸出

1 4 7 8 9 6 3 2 5

螺旋矩陣

按下示代碼組織的流程,應該能滿足任何逆時針螺旋矩陣的遍歷所需,至少該題的測試數據包括矩陣行高列寬 各爲 1、 奇數 、 偶數 的情況。
外層循環以 一圈 爲單位,循環次數符合短板效應,每次循環的起點皆爲 ( i + drift, j + drift)、中點同理,用 n 、m 與 drift 之於 i 、j 的關係來控制矩陣的縮緊,大概就是這樣。

1s 的限時是真的過分,但前期錯誤主要集中在沒做特判的細節處理上,也可以說沒有活用 drift 吧。

寫吐了

第一次做的螺旋矩陣寬高不能爲奇數,但反正我自己會做,時也、命也的話想必我會重新編輯吧。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt(), n = sc.nextInt();
        int[][] mat = new int[m][n];
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                mat[i][j] = sc.nextInt();
        StringBuilder out = new StringBuilder();
        int order = m < n? (m & 1) == 1? (m / 2) + 1: m / 2: (n & 1) == 1? (n / 2) + 1: n / 2,
                i, j, drift;
        for (i = j = drift = 0; order > 0; i = j = ++drift, order--) {
            while (i < m - drift)
                out.append(mat[i++][j] + " ");
            if (++j < n - drift) {
                for (i--; j < n - drift;)
                    out.append(mat[i][j++] + " ");
                for (j--, i--; i > drift;)
                    out.append(mat[i--][j] + " ");
            }
            if (j == n - drift - 1 && i != m - drift - 1 - (m & 1))
                while (j > drift)
                    out.append(mat[i][j--] + " ");
        }
        System.out.println(out);
    }
}

在這裏插入圖片描述
餘下的一次樣例

樣例輸入

3 2
1 2
3 4
5 6

樣例輸出

1 3 5 6 4 2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章