用 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]

如果網格類似於 -

123
456
789

輸出將是 -

912
345
678

要解決這個問題,我們將遵循以下步驟 -

  • 移動操作將把矩陣作為輸入

  • 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, ],]

更新於: 27-4-2020

499 次瀏覽

開啟你的 職業生涯

完成課程獲得認證

開始
廣告