Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Dịch chuyển lưới 2D (Shift 2D Grid) trong C++


Cho lưới 2D kích thước m x n và số k. Dịch chuyển lưới k lần. Quy tắc dịch:

  • Phần tử G[i][j] → G[i][j+1].
  • Phần tử G[i][n-1] → G[i+1][0].
  • Phần tử G[m-1][n-1] → G[0][0].

Ví dụ:

123
456
789

Sau 1 lần dịch:

912
345
678

Giải pháp:

  • Hàm shift nhận ma trận, n hàng, m cột, x = phần tử góc dưới phải.
  • Duyệt i từ n-1 xuống 0, j từ m-1 xuống 0:
    • Nếu j=0 và i>0: G[i][j] = G[i-1][m-1].
    • Nếu j>0: G[i][j] = G[i][j-1].
  • G[0][0] = x.
  • Lặp k lần: shift(G); k--.
  • Trả về G.

Ví dụ 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(), 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;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> mat = {{1,2,3},{4,5,6},{7,8,9}};
    print_vector(ob.shiftGrid(mat, 1));
}

Đầu vào

{{1,2,3},{4,5,6},{7,8,9}} 1

Đầu ra

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