用 C++ 轉換 2D 網格
假設我們有一個 m x n 大小的二維網格。我們還有另一個變數 k。我們必須將網格移動 k 次。移動操作如下
網格 G[i, j] 中的元素移動到 G[i, j + 1]
網格 G[i, n - 1] 中的元素移動到 G[i + 1, 0]
網格 G[m - 1, n - 1] 中的元素移動到 G[0, 0]
如果網格類似於 -
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
輸出將是 -
9 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
要解決這個問題,我們將遵循以下步驟 -
移動操作將把矩陣作為輸入
n = 行數,m := 列數,x := 右下角元素
對於 i := n - 1 到 0
對於 j := m - 1 到 0
如果 j = 0 且 i > 0,則 G[i, j] := G[i - 1, m - 1]
否則,如果 j > 0,則 G[i, j] := G[i, j - 1]
G[0, 0] := x
按以下規則呼叫移動操作 -
當 k 不為 0 時
移動網格 G
k 減 1
返回網格 G
示例 (C++)
我們來看一下下面的實現,以便更好地理解 -
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<int> > 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: void shift(vector<vector<int>>& grid){ int n = grid.size(); int m = grid[0].size(); int x = grid[n-1][m-1]; for(int i = n-1; i>=0; i--){ for(int j = m-1;j>=0;j--){ if(j == 0 && i>0){ grid[i][j] = grid[i-1][m-1]; } else if(j>0){ grid[i][j] = grid[i][j-1]; } } } grid[0][0] = x; } vector<vector<int>> shiftGrid(vector<vector<int>>& g, int k) { while(k--){ shift(g); } return g; } }; main(){ Solution ob; vector<vector<int>> mat = {{1,2,3},{4,5,6},{7,8,9}}; print_vector(ob.shiftGrid(mat, 1)); }
輸入
{{1,2,3},{4,5,6},{7,8,9}} 1
輸出
[[9, 1, 2, ],[3, 4, 5, ],[6, 7, 8, ],]
廣告