给定尺寸为N * M的矩阵 arr [] [],任务是生成一个矩阵,以使任何元素(r,c)存储在给定矩阵中水平,垂直和对角线方向上存在的相邻元素的总和。
例子:
    输入: arr [] [] = {{1,3},{2,4}}
    输出: {{9,7},{8,6}}
    说明:矩阵是通过以下操作构造的:
    对于单元格(0 ,0),arr [1] [0] + arr [0] [1] + arr [1] [1] = 2 + 3 + 4 =9。
    对于单元格(0,1),arr [1] [0 ] + arr [0] [0] + arr [1] [1] = 2 +1 + 4 =7。
    对于单元格(1,0),arr [0] [0] + arr [0] [1] + arr [1] [1] = 1 + 3 + 4 =8。
    对于单元格(1,1),arr [1] [0] + arr [0] [1] + arr [0] [0] = 2 + 3 +1 = 6。
    输入: arr [] [] = {{1}}
    输出: {{0}}
方法:想法是遍历给定矩阵的每个元素,对于每个像元(r,c),存储相邻像元{{r-1,c-1},{r + 1,c + 1}, {r-1,c + 1},{r + 1,c-1},{r,c-1},{r-1,c},{r + 1,c},{r,c + 1 }}。
- 初始化尺寸为N * M的矩阵v [] []以存储每个单元格的结果。
- 现在,遍历矩阵的每个单元格。对于每个单元格,检查有效的相邻单元格,并继续更新其总和。
- 遍历后,打印存储在矩阵v [] []的每个单元格中的值。
#include <bits/stdc++.h> 
using namespace std; 
// Initialize rows and columns 
int r, c; 
// Store all 8 directions 
vector<vector<int> > dir 
    = { { 1, 0 }, { -1, 0 }, 
        { 0, 1 }, { 0, -1 }, 
        { -1, -1 }, { -1, 1 }, 
        { 1, 1 }, { 1, -1 } }; 
// Function to check if a cell 
// (i, j) is valid or not 
bool valid(int i, int j) 
{ 
    if (i >= 0 && j >= 0 
        && i < r && j < c) 
        return 1; 
    return 0; 
} 
// Function to find sum of adjacent cells 
// for cell (i, j) 
int find(int i, int j, vector<vector<int> >& v) 
{ 
    // Initialize sum 
    int s = 0; 
    // Visit all 8 directions 
    for (auto x : dir) { 
        int ni = i + x[0], nj = j + x[1]; 
        // Check if cell is valid 
        if (valid(ni, nj)) 
            s += v[ni][nj]; 
    } 
    // Return sum 
    return s; 
} 
// Function to print sum of adjacent elements 
void findsumofneighbors(vector<vector<int> >& M) 
{ 
    // Stores the resultant matrix 
    vector<vector<int> > v( 
        r, vector<int>(c, 0)); 
    // Iterate each elements of matrix 
    for (int i = 0; i < r; i++) { 
        for (int j = 0; j < c; j++) { 
            // Find adjacent sum 
            v[i][j] = find(i, j, M); 
            cout << v[i][j] << " "; 
        } 
        cout << "\n"; 
    } 
} 
// Driver Code 
int main() 
{ 
    // Given matrix 
    vector<vector<int> > M 
        = { { 1, 4, 1 }, 
            { 2, 4, 5 }, 
            { 3, 1, 2 } }; 
    // Size of matrix 
    r = M.size(), c = M[0].size(); 
    // Function call 
    findsumofneighbors(M); 
} 
输出:
    10 13 13
    13 19 12
    7 16 10
时间复杂度: O(N * M),其中N * M是矩阵的维数。
辅助空间: O(N * M)

 
							 
										
										 
										
										 
										
										
										 
										
										 
										
										 
										
										
0 评论