首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 算法實戰:螺旋魔方陣生成與菱形圖形打印完整代碼詳解

     編輯:Java 相關知識

題目一:順時針螺旋魔方陣

問題描述

輸入 N (2≤N≤9),輸出 N×N 矩陣,數字 1~N² 從左上角起順時針螺旋填充。

N=3:          N=4:
1 2 3         1  2  3  4
8 9 4         12 13 14 5
7 6 5         11 16 15 6
                10  9  8 7

核心思路:方向狀態機 + 邊界檢測

維護四個方向枚舉(右、下、左、上),當前位置撞牆或遇到已填數字時,順時針轉向。

完整實現(含格式化輸出)

import java.util.Arrays;
import java.util.Scanner;

public class SpiralMatrix {
    
    enum Direction { RIGHT, DOWN, LEFT, UP }
    
    public int[][] buildSpiral(int n) {
        int[][] matrix = new int[n][n];
        for (int[] row : matrix) Arrays.fill(row, 0); // 0 表示未填充
        
        int row = 0, col = 0;
        int counter = 1;
        Direction dir = Direction.RIGHT;
        
        while (true) {
            if (matrix[row][col] == 0) {
                matrix[row][col] = counter++;
                
                // 嘗試按當前方向前進
                switch (dir) {
                    case RIGHT:
                        if (col + 1 < n && matrix[row][col + 1] == 0) col++;
                        else { dir = Direction.DOWN; row++; }
                        break;
                    case DOWN:
                        if (row + 1 < n && matrix[row + 1][col] == 0) row++;
                        else { dir = Direction.LEFT; col--; }
                        break;
                    case LEFT:
                        if (col - 1 >= 0 && matrix[row][col - 1] == 0) col--;
                        else { dir = Direction.UP; row--; }
                        break;
                    case UP:
                        if (row - 1 >= 0 && matrix[row - 1][col] == 0) row--;
                        else { dir = Direction.RIGHT; col++; }
                        break;
                }
            } else {
                break; // 回到起點或填滿,結束
            }
        }
        return matrix;
    }
    
    public void printMatrix(int[][] matrix) {
        for (int[] row : matrix) {
            for (int val : row) {
                System.out.printf("%4d", val); // 每個數字佔 4 字符,右對齊
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入矩陣階數 N (2-9): ");
        int n = sc.nextInt();
        if (n < 2 || n > 9) {
            System.out.println("N 超出範圍");
            return;
        }
        SpiralMatrix sm = new SpiralMatrix();
        int[][] result = sm.buildSpiral(n);
        sm.printMatrix(result);
    }
}

複雜度分析

  • 時間:O(N²) —— 每個格子恰好訪問一次
  • 空間:O(N²) —— 輸出矩陣本身

題目二:菱形圖形打印

效果預覽 (n=4)

      * 
    * * * 
  * * * * * 
* * * * * * * 
  * * * * * 
    * * * 
      * 

核心邏輯:單循環控制上下半部

用變量 i 表示當前行距離中線的偏移(-n 到 n),flag 控制增減方向。

精簡實現

public class DiamondPrinter {
    
    public void printDiamond(int n) {
        if (n <= 0) return;
        
        for (int i = 0; i < 2 * n - 1; i++) {
            int spaces, stars;
            if (i < n) { // 上半部含中線
                spaces = n - 1 - i;
                stars = 2 * i + 1;
            } else { // 下半部
                spaces = i - n + 1;
                stars = 2 * (2 * n - 1 - i) - 1;
            }
            
            // 打印空格
            for (int s = 0; s < spaces; s++) System.out.print("  "); // 兩空格對齊
            // 打印星號(中間帶空格美觀)
            for (int s = 0; s < stars; s++) System.out.print("* ");
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        new DiamondPrinter().printDiamond(5);
    }
}

關鍵點解析

  • 行數公式:總行數 = 2n - 1
  • 星號數:第 i 行 (0-index) 為 2*i+1 (上半) 或 2*(2n-1-i)-1 (下半)
  • 空格數:保證菱形居中,每級縮進 2 字符

進階擴展:字符菱形、空心菱形

// 空心菱形:只打印邊框
if (s == 0 || s == stars - 1) System.out.print("* ");
else System.out.print("  ");

// 指定字符菱形
printDiamond(4, '#'); // 重載方法接受字符參數

總結

螺旋矩陣體現狀態機思維,菱形打印體現數學規律提煉。兩題皆屬基礎算法訓練,關鍵在於:

  1. 建立清晰的坐標/行列模型
  2. 提煉邊界條件與狀態轉移規則
  3. 代碼結構清晰,邊界測試完備(N=2, N=9, 奇偶)

建議動手嘗試:逆時針螺旋、帶間隔菱形、多層嵌套菱形。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved