คำอธิบายปัญหา
ได้รับเมทริกซ์ 2D ขนาด n x n (โดย n เป็นเลขคี่) ต้องการหา ความยาวด้านสูงสุดของสี่เหลี่ยมจัตุรัส ที่:
- มีศูนย์กลางตรงกับศูนย์กลางของเมทริกซ์
- ค่าบน เส้นรอบรูป (Perimeter) ของสี่เหลี่ยมจัตุรัสมีค่า เท่ากันทุกตัว
ตัวอย่าง
Input:
mat[][] = {
{2, 4, 6, 6, 5},
{1, 7, 7, 7, 3},
{5, 7, 0, 7, 1},
{3, 7, 7, 7, 1},
{2, 0, 1, 3, 2}
}
Output: 3
คำอธิบาย: สี่เหลี่ยมจัตุรัสขนาด 3x3 ตรงกลาง มีเส้นรอบรูปเป็น 7 ทั้งหมด (index 1 ถึง 3 ทั้งแถวและคอลัมน์)
แนวทางแก้ปัญหา
- หา ศูนย์กลาง ของเมทริกซ์:
center = n/2(0-indexed) - ตรวจสอบสี่เหลี่ยมจัตุรัสแต่ละขนาด โดยขยายออกจากศูนย์กลางทีละชั้น (i = 0 ถึง n/2):
- สี่เหลี่ยมที่ห่างจากศูนย์กลาง i ชั้น จะมีขนาด
n - 2*i - ตรวจสอบเส้นรอบรูป 4 ด้าน: แถวบน, แถวล่าง, คอลัมน์ซ้าย, คอลัมน์ขวา
- ถ้าค่าทุกตัวบนเส้นรอบรูปเท่ากัน → บันทึกความยาวด้าน
- สี่เหลี่ยมที่ห่างจากศูนย์กลาง i ชั้น จะมีขนาด
- คืนค่าความยาวด้านสูงสุดที่พบ
โค้ดตัวอย่าง C++
#include <iostream>
#define n 5
using namespace std;
int findMaxSideSquare(int matrix[][n]) {
int squareLen = 1; // ขนาด 1x1 เสมอเป็นจริง (แค่จุดกึ่งกลาง)
for (int i = 0; i < n / 2; i++) {
int sideVal = matrix[i][i]; // ค่าที่คาดหวังบนเส้นรอบรูป
bool isSquare = true;
for (int j = i; j < n - i; j++) {
// ตรวจสอบ 4 ด้าน
if (matrix[i][j] != sideVal) isSquare = false; // Top
if (matrix[n - i - 1][j] != sideVal) isSquare = false; // Bottom
if (matrix[j][i] != sideVal) isSquare = false; // Left
if (matrix[j][n - i - 1] != sideVal) isSquare = false; // Right
}
if (isSquare)
squareLen = n - 2 * i;
}
return squareLen;
}
int main() {
int mat[n][n] = {
{2, 4, 6, 6, 5},
{1, 7, 7, 7, 3},
{5, 7, 0, 7, 1},
{3, 7, 7, 7, 1},
{2, 0, 1, 3, 2}
};
cout << "The maximum side length of square in a Matrix is " << findMaxSideSquare(mat);
return 0;
}
ผลลัพธ์
The maximum side length of square in a Matrix is 3