Giả sử chúng ta có một lưới 2D kích thước m x n. Chúng ta có một biến k khác. Chúng ta phải thay đổi lưới điện k lần. Hoạt động thay đổi sẽ như sau
-
Phần tử ở lưới G [i, j] di chuyển đến G [i, j + 1]
-
Phần tử ở lưới G [i, n - 1] di chuyển đến G [i + 1, 0]
-
Phần tử ở lưới G [m - 1, n - 1] di chuyển đến G [0, 0]
Vì vậy, nếu lưới giống như -
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
Đầu ra sẽ là -
| 9 | 1 | 2 |
| 3 | 4 | 5 |
| 6 | 7 | 8 |
Để giải quyết vấn đề này, chúng ta sẽ làm theo các bước sau -
-
Thao tác shift sẽ lấy ma trận làm đầu vào
-
n =số hàng, m:=số cột, x:=phần tử dưới cùng bên phải
-
đối với i:=n - 1, giảm xuống 0
-
cho j:=m - 1 xuống 0
-
nếu j =0 và i> 0, thì G [i, j]:=G [i - 1, m - 1]
-
else nếu j> 0 thì G [i, j]:=G [i, j - 1]
-
-
-
G [0, 0]:=x
-
Gọi hoạt động shift theo quy tắc sau -
-
trong khi k không phải là 0
-
chuyển lưới G
-
giảm k đi 1
-
-
lưới trả về G
Ví dụ (C ++)
Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn -
#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));
} Đầu vào
{{1,2,3},{4,5,6},{7,8,9}}
1 Đầu ra
[[9, 1, 2, ],[3, 4, 5, ],[6, 7, 8, ],]