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

ผลรวมบล็อกเมทริกซ์ใน C++


สมมติว่าเรามีเมทริกซ์ขนาด m x n ชื่อ mat และจำนวนเต็ม K เราต้องการหาเมทริกซ์อีกตัวหนึ่งชื่อ answer โดยที่แต่ละ answer[i][j] คือผลรวมของทุกองค์ประกอบ mat[r][c] ที่สอดคล้องกับเงื่อนไข i - K <= r <= i + K, j - K <= c <= j + K และ (r, c) เป็นตำแหน่งที่ถูกต้องในเมทริกซ์

ตัวอย่าง เมทริกซ์อินพุต:

123
456
789

ถ้า k = 1 ผลลัพธ์จะเป็น:

122116
274533
243928

ขั้นตอนการแก้ปัญหา

  • n := จำนวนแถว, m := จำนวนคอลัมน์
  • กำหนดเมทริกซ์ ans ขนาด n x m
  • วนลูป i จาก 0 ถึง n-1
    • วนลูป j จาก 0 ถึง m-1
      • วนลูป r จาก i - k ถึง i + k
        • วนลูป c จาก j - k ถึง j + k
          • ถ้า r และ c อยู่ในขอบเขตของเมทริกซ์ แล้ว:
            • ans[i][j] := ans[i][j] + mat[r][c]
    • คืนค่า ans

    ตัวอย่างโค้ด (C++)

    #include <bits/stdc++.h> 
    using namespace std; 
    
    void print_vector(vector<vector<auto> > v) {
        cout << "[";
        for(int i = 0; i < v.size(); i++) {
            cout << "[";
            for(int j = 0; j < v[i].size(); j++) {
                cout << v[i][j] << ", ";
            }
            cout << "],";
        }
        cout << "]" << endl;
    }
    
    class Solution {
    public:
        vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
            int n = mat.size();
            int m = mat[0].size();
            vector < vector <int> > ans(n , vector <int> (m));
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    for(int r = i - k; r <= i + k; r++) {
                        for(int c = j - k; c <= j + k; c++) {
                            if(r >= 0 && r < n && c >= 0 && c < m) {
                                ans[i][j] += mat[r][c];
                            }
                        }
                    }
                }
            }
            return ans;
        }
    };
    
    int main() {
        vector<vector<int>> v1 = {{1,2,3},{4,5,6},{7,8,9}};
        Solution ob;
        print_vector(ob.matrixBlockSum(v1, 1));
    }

    อินพุต

    [[1,2,3],[4,5,6],[7,8,9]] 1

    เอาต์พุต

    [[12, 21, 16, ],[27, 45, 33, ],[24, 39, 28, ],]