การพิมพ์รูปแบบสไปรัลตัวเลข (Spiral Number Pattern) ใน Java
รูปแบบสไปรัล (Spiral) แสดงตัวเลขจัดเรียงเป็นสี่เหลี่ยมจัตุรัส ตัวเลขลดลงจากขอบเข้าสู่กึ่งกลาง ใช้สูตรทางคณิตศาสตร์ Math.max(Math.abs(i - center), Math.abs(j - center)) + 1
อัลกอริทึม
- รับขนาด
n(ตัวเลขสูงสุดที่ขอบ) - ขนาดเมทริกซ์
size = 2*n - 1 - กึ่งกลางอยู่ที่ index
n(1-based) หรือn-1(0-based) - ลูปแถว i = 1 ถึง size
- ลูปคอลัมน์ j = 1 ถึง size
- คำนวณค่า:
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