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

นับ Magic Squares ในกริด (Grid) ใน C++


เราได้รับเมทริกซ์ตัวเลข เป้าหมายคือหาจำนวน Magic Squares ภายในเมทริกซ์นั้น

Magic Square (ถ้ามองเป็นเมทริกซ์) คือเมทริกซ์ 3x3 ที่มีตัวเลข 1 ถึง 9 ครั้งละ 1 ครั้ง (เหมือนกริดซูโดกุ) คุณสมบัติ:

  • ตัวเลขทุกตัวเกิดขึ้นครั้งละ 1 ครั้ง
  • ผลรวมทั้ง 9 เซลล์ = 45
  • ผลรวมแต่ละแถว 3 ตัว = 15
  • ผลรวมแต่ละคอลัมน์ 3 ตัว = 15
  • ผลรวมเส้นทแยงมุม 3 ตัว = 15
  • เพื่อให้ได้ผลรวมเหล่านี้ 5 ต้องอยู่ตรงกลางเส้นทแยงมุมทั้งสองเสมอ

อินพุต

int arr[][] = {{1,2,3,0}, {4,5,6,1}, {7,8,9,0}};

เอาต์พุต

Magic Squares present: 0

คำอธิบาย − ตัวเลข 1-9 ครบและไม่ซ้ำ แต่ผลรวมแถว: 1+2+3=6 ≠ 4+5+6=15 ≠ 7+8+9=24 เส้นทแยงมุมก็ไม่ได้ 15

อินพุต

arr[][] = {{8,1,6,4}, {3,5,7,0}, {4,9,2,0}};

เอาต์พุต

Magic Squares present: 1

คำอธิบาย − ตัวเลข 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 อยู่กลาง

วิธีการที่ใช้ในโปรแกรมด้านล่าง

  • อาเรย์ Grid[][] เก็บตัวเลข row, col เก็บมิติ
  • ฟังก์ชัน magicSquare(int a...int i) รับ 9 ตัวเลข ตรวจสอบว่าเป็น Magic Square คืน 1 ถ้าใช่ มิฉะนั้น 0
  • ใช้ arr[9] เก็บตัวเลข ตรวจสอบความครบและไม่ซ้ำ (count ต้องเป็น 1 ทุกตัว) มิฉะนั้น flag=0
  • ถ้า flag=1 ตรวจสอบผลรวมแถว, คอลัมน์, เส้นทแยง = 15 คืน 1 มิฉะนั้น 0
  • ฟังก์ชัน countSquares(int G[3][4], int R, int C) นับ Magic Squares ในกริด
  • ลูป i=0 ถึง R-2, j=0 ถึง C-2 (เมทริกซ์ 3x3)
  • ถ้ากลางเส้นทแยง G[i+1][j+1] != 5 ข้าม (ไม่เป็น Magic Square)
  • ส่ง 9 ตัวเลขเข้า magicSquare() ถ้าคืน 1 เพิ่ม count
  • คืนค่า count

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

int magicSquare(int a, int b, int c, int d, int e, int f, int g, int h, int i) {
    int flag = 1;
    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 k = 0; k < 9; k++)
        if (arr[k] > 1 || arr[k] < 1) { flag = 0; break; }
    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]);
            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, col = 4;
    cout << "Count of Magic Squares in Grid: " << countSquares(Grid, row, col);
    return 0;
}

ผลลัพธ์

Count of Magic Squares in Grid: 1