โจทย์
สามเหลี่ยมมุมฉากเท่ากับขา (Right Isosceles Triangle) ฐาน = สูง = B หาจำนวนสี่เหลี่ยมจัตุรัสขนาด **2×2** ที่ใส่ได้มากที่สุด
การวิเคราะห์เรขาคณิต
วางสี่เหลี่ยม 2×2 เรียงแถวจากฐานขึ้นไป:
- แถวที่ 1 (ฐาน): วางได้
(B - 2) / 2ชิ้น (ลบ 2 ออกเพราะมุมสามเหลี่ยม) - แถวที่ 2: ฐานเหลือ
B - 2วางได้(B - 4) / 2ชิ้น - แถวที่ 3: ฐานเหลือ
B - 4วางได้(B - 6) / 2ชิ้น - ... จนกว่า ฐาน ≤ 2
สูตรคณิตศาสตร์
ให้ n = (B - 2) / 2 (Integer Division)
จำนวนสี่เหลี่ยม = 1 + 2 + 3 + ... + n = n(n+1)/2
ตัวอย่าง: B = 12
n = (12-2)/2 = 5 Squares = 5×6/2 = 15 Row 1: base 12 → (12-2)/2 = 5 squares Row 2: base 10 → (10-2)/2 = 4 squares Row 3: base 8 → (8-2)/2 = 3 squares Row 4: base 6 → (6-2)/2 = 2 squares Row 5: base 4 → (4-2)/2 = 1 square Total: 5+4+3+2+1 = 15
ตัวอย่าง: B = 5
n = (5-2)/2 = 1 (Integer Division) Squares = 1×2/2 = 1 Row 1: base 5 → (5-2)/2 = 1 square Row 2: base 3 → (3-2)/2 = 0 square (Stop) Total: 1
โปรแกรม C
#include
#include
int maxSquares(int base) {
// ลบ 2 ออกสำหรับมุมสองมุม
base = base - 2;
// แต่ละสี่เหลี่ยมกว้าง 2
base = base / 2; // floor division
// ผลรวม 1+2+...+base
return base * (base + 1) / 2;
}
int main() {
int base;
printf("Enter base/height of triangle: ");
scanf("%d", &base);
if (base < 2) {
printf("Base too small for 2x2 square\n");
return 0;
}
int result = maxSquares(base);
printf("Maximum 2x2 squares: %d\n", result);
return 0;
}
ผลลัพธ์:
Enter base/height of triangle: 8
Maximum 2x2 squares: 6
Enter base/height of triangle: 12
Maximum 2x2 squares: 15
Enter base/height of triangle: 5
Maximum 2x2 squares: 1
Complexity
- Time: O(1) - คำนวณสูตรโดยตรง
- Space: O(1)
การขยาย: สี่เหลี่ยมขนาด S×S
int maxSquaresSize(int base, int S) {
if (base < S) return 0;
int n = (base - S) / S; // จำนวนสี่เหลี่ยมในแถวแรก
return n * (n + 1) / 2;
}