ตรวจสอบจตุรัสกล (Magic Square)
โจทย์
จตุรัสกล (Magic Square) คือตารางตัวเลขที่ผลรวมของตัวเลขในแต่ละแถว แต่ละคอลัมน์ และทั้งสองแนวทแยงมุลมีค่าเท่ากันทั้งหมด สำหรับตาราง n x n ที่กำหนดให้ งานของคุณคือการตรวจสอบว่าตารางนี้เป็นจตุรัสกลหรือไม่ ตารางจะประกอบด้วยจำนวนเต็ม และขนาดของตารางจะถูกกำหนดเป็นข้อมูลนำเข้า
ตัวอย่าง: n = 3 (หมายถึงจตุรัสกลขนาด 3 x 3)
| Input | Output |
|---|---|
| 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]เก็บผลรวมของแถวที่ iverticalSum[j]เก็บผลรวมของคอลัมน์ที่ jdiagonalLeftSumเก็บผลรวมของเส้นทแยงมุมจากซ้ายบนไปขวาล่าง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)
ปรับปรุงล่าสุด