Skip to Content
CoursesCSC102ตรวจสอบจตุรัสกล (Magic Square)

ตรวจสอบจตุรัสกล (Magic Square)

โจทย์

จตุรัสกล (Magic Square) คือตารางตัวเลขที่ผลรวมของตัวเลขในแต่ละแถว แต่ละคอลัมน์ และทั้งสองแนวทแยงมุลมีค่าเท่ากันทั้งหมด สำหรับตาราง n x n ที่กำหนดให้ งานของคุณคือการตรวจสอบว่าตารางนี้เป็นจตุรัสกลหรือไม่ ตารางจะประกอบด้วยจำนวนเต็ม และขนาดของตารางจะถูกกำหนดเป็นข้อมูลนำเข้า

ตัวอย่าง: n = 3 (หมายถึงจตุรัสกลขนาด 3 x 3)

InputOutput
3
2 7 6
9 5 1
4 3 8
true

โค้ด

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int matrixSize = scanner.nextInt(); int[][] matrix = new int[matrixSize][matrixSize]; for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixSize; j++) { matrix[i][j] = scanner.nextInt(); } } int[] verticalSum = new int[matrixSize]; int[] horizontalSum = new int[matrixSize]; int diagonalLeftSum = 0; int diagonalRightSum = 0; for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixSize; j++) { horizontalSum[i] += matrix[i][j]; verticalSum[j] += matrix[i][j]; } diagonalLeftSum += matrix[i][i]; diagonalRightSum += matrix[i][matrixSize - i - 1]; } int referenceSum = horizontalSum[0]; boolean isMagicSquare = true; for (int sum : horizontalSum) { if (sum != referenceSum) { isMagicSquare = false; break; } } if (isMagicSquare) { for (int sum : verticalSum) { if (sum != referenceSum) { isMagicSquare = false; break; } } } if (isMagicSquare) { if (diagonalLeftSum != referenceSum || diagonalRightSum != referenceSum) { isMagicSquare = false; } } System.out.println(isMagicSquare); } }

คำอธิบาย

import java.util.Scanner;
  • เราเริ่มต้นด้วยการนำเข้า (import) คลาส Scanner ซึ่งใช้สำหรับการรับข้อมูลจากผู้ใช้
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
  • เราสร้างคลาสหลักชื่อ Main
  • เมธอด main เป็นจุดเริ่มต้นของโปรแกรม
  • เราสร้างออบเจ็กต์ Scanner เพื่อรับข้อมูลจากผู้ใช้
int matrixSize = scanner.nextInt(); int[][] matrix = new int[matrixSize][matrixSize];
  • เรารับขนาดของเมทริกซ์จากผู้ใช้และเก็บไว้ในตัวแปร matrixSize
  • เราสร้างอาร์เรย์สองมิติ matrix ขนาด matrixSize x matrixSize เพื่อเก็บข้อมูลของจตุรัส
for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixSize; j++) { matrix[i][j] = scanner.nextInt(); } }
  • เราใช้ลูปซ้อนเพื่อรับค่าจากผู้ใช้สำหรับแต่ละช่องในเมทริกซ์
int[] verticalSum = new int[matrixSize]; int[] horizontalSum = new int[matrixSize]; int diagonalLeftSum = 0; int diagonalRightSum = 0;
  • เราสร้างอาร์เรย์เพื่อเก็บผลรวมแนวตั้ง (verticalSum) และแนวนอน (horizontalSum)
  • เราสร้างตัวแปรเพื่อเก็บผลรวมของเส้นทแยงมุมจากซ้ายบนไปขวาล่าง (diagonalLeftSum) และจากขวาบนไปซ้ายล่าง (diagonalRightSum)
for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixSize; j++) { horizontalSum[i] += matrix[i][j]; verticalSum[j] += matrix[i][j]; } diagonalLeftSum += matrix[i][i]; diagonalRightSum += matrix[i][matrixSize - i - 1]; }
  • เราใช้ลูปซ้อนเพื่อคำนวณผลรวมแนวนอน แนวตั้ง และทแยงมุม
  • horizontalSum[i] เก็บผลรวมของแถวที่ i
  • verticalSum[j] เก็บผลรวมของคอลัมน์ที่ j
  • diagonalLeftSum เก็บผลรวมของเส้นทแยงมุมจากซ้ายบนไปขวาล่าง
  • diagonalRightSum เก็บผลรวมของเส้นทแยงมุมจากขวาบนไปซ้ายล่าง
int referenceSum = horizontalSum[0];
  • เราใช้ผลรวมของแถวแรกเป็นค่าอ้างอิงสำหรับการเปรียบเทียบ
boolean isMagicSquare = true; for (int sum : horizontalSum) { if (sum != referenceSum) { isMagicSquare = false; break; } }
  • เราสร้างตัวแปร isMagicSquare และกำหนดค่าเริ่มต้นเป็น true
  • เราตรวจสอบว่าผลรวมของทุกแถวเท่ากับค่าอ้างอิงหรือไม่ ถ้าไม่เท่า เราจะกำหนด isMagicSquare เป็น false และออกจากลูป
if (isMagicSquare) { for (int sum : verticalSum) { if (sum != referenceSum) { isMagicSquare = false; break; } } }
  • ถ้ายังเป็นจตุรัสกล เราจะตรวจสอบผลรวมของทุกคอลัมน์ว่าเท่ากับค่าอ้างอิงหรือไม่
if (isMagicSquare) { if (diagonalLeftSum != referenceSum || diagonalRightSum != referenceSum) { isMagicSquare = false; } }
  • ถ้ายังเป็นจตุรัสกล เราจะตรวจสอบผลรวมของทั้งสองเส้นทแยงมุมว่าเท่ากับค่าอ้างอิงหรือไม่
System.out.println(isMagicSquare);
  • เราแสดงผลลัพธ์ว่าเป็นจตุรัสกลหรือไม่ (true หรือ false)
ปรับปรุงล่าสุด