Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

โปรแกรม Java พิมพ์รูปแบบสไปรัลตัวเลข (Spiral Pattern of Numbers)

การพิมพ์รูปแบบสไปรัลตัวเลข (Spiral Number Pattern) ใน Java

รูปแบบสไปรัล (Spiral) แสดงตัวเลขจัดเรียงเป็นสี่เหลี่ยมจัตุรัส ตัวเลขลดลงจากขอบเข้าสู่กึ่งกลาง ใช้สูตรทางคณิตศาสตร์ Math.max(Math.abs(i - center), Math.abs(j - center)) + 1

อัลกอริทึม

  1. รับขนาด n (ตัวเลขสูงสุดที่ขอบ)
  2. ขนาดเมทริกซ์ size = 2*n - 1
  3. กึ่งกลางอยู่ที่ index n (1-based) หรือ n-1 (0-based)
  4. ลูปแถว i = 1 ถึง size
  5. ลูปคอลัมน์ j = 1 ถึง size
  6. คำนวณค่า: Math.max(Math.abs(i - n), Math.abs(j - n)) + 1

ตัวอย่างที่ 1: รับค่าจากผู้ใช้ (Scanner)

import java.util.Scanner;
import java.lang.Math;

public class SpiralPattern {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("ป้อนขนาด: ");
        int n = scanner.nextInt();
        
        System.out.println("รูปแบบสไปรัล:");
        int size = 2 * n - 1;
        
        for (int i = 1; i <= size; i++) {
            for (int j = 1; j <= size; j++) {
                int value = Math.max(Math.abs(i - n), Math.abs(j - n)) + 1;
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}

ตัวอย่างที่ 2: ค่าคงที่ (Hardcoded)

import java.lang.Math;

public class SpiralPattern {
    public static void main(String[] args) {
        int n = 5;
        System.out.println("ขนาด: " + n);
        System.out.println("รูปแบบสไปรัล:");
        
        int size = 2 * n - 1;
        
        for (int i = 1; i <= size; i++) {
            for (int j = 1; j <= size; j++) {
                int value = Math.max(Math.abs(i - n), Math.abs(j - n)) + 1;
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}

ผลลัพธ์ (n=5)

รูปแบบสไปรัล:
5 5 5 5 5 5 5 5 5 
5 4 4 4 4 4 4 4 5 
5 4 3 3 3 3 3 4 5 
5 4 3 2 2 2 3 4 5 
5 4 3 2 1 2 3 4 5 
5 4 3 2 2 2 3 4 5 
5 4 3 3 3 3 3 4 5 
5 4 4 4 4 4 4 4 5 
5 5 5 5 5 5 5 5 5

การปรับปรุง: ใช้ StringBuilder และ 0-based Index (Java 11+)

public class SpiralPatternModern {
    public static void main(String[] args) {
        int n = 5;
        int size = 2 * n - 1;
        int center = n - 1; // 0-based
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                int value = Math.max(Math.abs(i - center), Math.abs(j - center)) + 1;
                sb.append(value).append(" ");
            }
            sb.append("\n");
        }
        
        System.out.print(sb.toString());
    }
}

รูปแบบแปรผัน: Spiral Matrix (เติมตัวเลขแบบเกลียว)

public class SpiralMatrixFill {
    public static void main(String[] args) {
        int n = 4;
        int[][] matrix = new int[n][n];
        int num = 1;
        int top = 0, bottom = n - 1, left = 0, right = n - 1;
        
        while (num <= n * n) {
            // ซ้าย -> ขวา
            for (int j = left; j <= right; j++) matrix[top][j] = num++;
            top++;
            
            // บน -> ล่าง
            for (int i = top; i <= bottom; i++) matrix[i][right] = num++;
            right--;
            
            // ขวา -> ซ้าย
            if (top <= bottom) {
                for (int j = right; j >= left; j--) matrix[bottom][j] = num++;
                bottom--;
            }
            
            // ล่าง -> บน
            if (left <= right) {
                for (int i = bottom; i >= top; i--) matrix[i][left] = num++;
                left++;
            }
        }
        
        // พิมพ์
        for (int[] row : matrix) {
            for (int val : row) System.out.printf("%3d", val);
            System.out.println();
        }
    }
}

ผลลัพธ์ Spiral Matrix (n=4)

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

การวิเคราะห์

  • Time: O(n²) - ต้องคำนวณทุกเซลล์ในเมทริกซ์ (2n-1)²
  • Space: O(1) เพิ่มเติม (O(n²) ถ้าเก็บในเมทริกซ์)
  • สูตรคณิตศาสตร์ทำให้ไม่ต้องใช้ state machine หรือ direction tracking
  • เหมาะสำหรับการสร้างภาพระยะห่าง (Distance field) หรือ heightmap