เราได้รับเมทริกซ์ของตัวเลข เป้าหมายคือการหาจำนวน Magic Squares ที่มีอยู่ภายในเมทริกซ์ที่กำหนด
Magic Square หากนำมาเป็นเมทริกซ์ จะเป็นเมทริกซ์ขนาด 3X3 ซึ่งมีองค์ประกอบตั้งแต่ 1 ถึง 9 เช่นเดียวกับตารางในซูโดกุ คุณสมบัติคือ −
- ตัวเลขทั้งหมดเกิดขึ้นเพียงครั้งเดียว
- ผลรวมของทั้ง 9 เซลล์ในเมทริกซ์คือ 45
- ผลรวมของแถวละ 3 อันคือ 15
- ผลรวมของแต่ละคอลัมน์ของ 3 คือ 15
- ผลรวมของเส้นทแยงมุมของ 3 คือ 5.
- เพื่อให้ได้ผลรวมดังกล่าว 5 จะอยู่ตรงกลางของเส้นทแยงมุมทั้งสองเสมอ
อินพุต
int arr[][]= { { 1,2,3,0 }, { 4,5,6,1 }, { 7,8,9,0 } };
ผลลัพธ์
Magic Squares present: 0
คำอธิบาย − การสร้างรูปแบบเมทริกซ์เพื่อให้เข้าใจ -
1 | 2 | 3 | 0 |
4 | 5 | 6 | 1 |
7 | 8 | 9 | 0 |
องค์ประกอบทั้งหมดอยู่ระหว่าง 1 ถึง 9 และมีลักษณะเฉพาะ แต่
1+2+3=6 !=4+5+6=15 !=7+8+9=23
ผลรวมในแนวทแยงไม่เท่ากับ 15
อินพุต
arr[][]= { { 1,2,3,0 }, { 4,5,6,1 }, { 7,8,9,0 } };
ผลลัพธ์
Magic Squares present : 1
คำอธิบาย − การสร้างรูปแบบเมทริกซ์เพื่อให้เข้าใจ -
1 | 6 | 8 | 4 |
8 | 1 | 6 | 0 |
3 | 5 | 7 | 1 |
4 | 9 | 2 | 0 |
ตัวเลขทั้งหมดไม่ซ้ำกันและอยู่ในช่วง 1 ถึง 9
ผลรวมแถว 8+1+6=3+5+7=4+9+2=15
ผลรวมคอลัมน์ 8+3+4=1+5+9=6+7+2=15
ผลรวมเส้นทแยงมุม 8+5+2=4+5+6=15
บวก 1 ถึง 9 เราจะได้ 45 และ 5 อยู่ตรงกลางของเส้นทแยงมุมทั้งสอง
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
Integer array Grid[][] เก็บตัวเลข แถวและ col เก็บมิติข้อมูล
-
ฟังก์ชัน magicSquare(int a, int b…..int i) รับทั้ง 9 องค์ประกอบเป็นอินพุตและตรวจสอบว่าสร้างตารางเวทย์มนตร์หรือไม่ คืนค่า 1 หากเป็นตารางเวทย์มนตร์ คืนค่า 1 หากเป็นอย่างอื่น
-
ที่นี่เราจะใช้อาร์เรย์ arr[9] เพื่อจัดเก็บพารามิเตอร์ทั้งหมดและตรวจสอบว่าพารามิเตอร์เหล่านี้ไม่ซ้ำกันหรือไม่โดยตรวจสอบว่ามีเซลล์ที่ไม่ซ้ำอยู่ในนั้น หากเซลล์มีจำนวน <1 แสดงว่าไม่มี ไม่อยู่ในช่วง 1 ถึง 9 หรือถ้านับ>1 ก็ไม่ใช่ ไม่ซ้ำกัน set flag=0
-
หากแฟล็กเป็น 1 เราจะตรวจสอบผลรวมของแถว คอลัมน์ และแนวทแยงเป็น 15 หากเป็นจริง จะเป็นค่า amagic square คืนค่า 1 กลับเป็น 0
-
ฟังก์ชัน countSquares (int G[3][4],int R, int C) รับตาราง แถวและคอลัมน์เป็นอินพุตและนับจำนวน ของสี่เหลี่ยมวิเศษที่มีอยู่ในนั้น
-
Count ใช้สำหรับนับจำนวนช่องสี่เหลี่ยมดังกล่าว
-
เริ่มสำรวจจากองค์ประกอบแรกจนถึงแถวที่ 2, col-2 ( เมทริกซ์ 3X3 )
-
หากจุดกึ่งกลางของเส้นทแยงมุม G[i+1][j+1] ไม่ใช่ 5 แสดงว่าไม่สามารถใช้ตารางเวทย์มนตร์ได้ ให้ข้ามการวนซ้ำปัจจุบัน
-
ตรวจสอบองค์ประกอบทั้ง 9 อย่างอื่นโดยส่งไปยัง magicSquare( int a ถึง i )
-
ทั้ง 9 องค์ประกอบรวมทั้ง G[i][j] คือ G[i+1][j], G[i+2][j],G[i+1][j+1],G[i][j] +1],G[i][j+2],G[i+2][j+2],G[i+2][j+1],G[i+1][j+2]
-
หากกลับมานับเพิ่ม 1 ครั้ง
-
ในที่สุดผลตอบแทนนับตามผลลัพธ์ที่ต้องการ
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; // to check is subgrid is Magic Square int magicSquare(int a, int b, int c, int d, int e, int f, int g, int h, int i){ int flag=1; // to mark all numbers are unique and between 1 to 9 int arr[9]={0}; arr[a-1]++; arr[b-1]++; arr[c-1]++; arr[d-1]++; arr[e-1]++; arr[f-1]++; arr[g-1]++; arr[h-1]++; arr[i-1]++; for(int i=0;i<9;i++) if(arr[i]>1 || arr[i]<1) //every number occurs exactly once{ flag=0; break; } // checking all sums as 15 if (flag==1 && (a + b + c) == 15 && (d + e + f) == 15 && (g + h + i) == 15 && (a + d + g) == 15 &&(b + e + h) == 15 && (c + f + i) == 15 &&(a + e + i) == 15 && (c + e + g) == 15) return 1; return 0; } int countSquares(int G[3][4],int R, int C){ int count = 0; for (int i = 0; i < R - 2; i++) for (int j = 0; j < C - 2; j++) { if (G[i + 1][j + 1] != 5) continue; int ismagic=magicSquare(G[i][j], G[i][j + 1], G[i][j + 2], G[i + 1][j], G[i + 1][j + 1], G[i + 1][j + 2], G[i + 2][j], G[i + 2][j + 1], G[i + 2][j + 2]); // check for magic square subgrid if (ismagic==1) count++; } return count; } int main(){ int Grid[3][4] = { { 4, 3, 8, 4 },{ 9, 5, 1, 9 },{ 2, 7, 6, 2 } }; int row=3; int col=4; cout <<"Count of Magic Squares in Grid: "<<countSquares(Grid,row,col); return 0; }
ผลลัพธ์
Count of Magic Squares in Grid: 1