Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 2D 그리드 이동


크기가 m x n인 하나의 2D 그리드가 있다고 가정합니다. 또 다른 변수 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 :=오른쪽 하단 요소

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