Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับสี่เหลี่ยมมายากลในตารางใน C ++


เราได้รับเมทริกซ์ของตัวเลข เป้าหมายคือการหาจำนวน 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