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ụ:
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
Sau 1 lần dịch:
| 9 | 1 | 2 |
| 3 | 4 | 5 |
| 6 | 7 | 8 |
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, ],]