Giả sử, chúng ta được cung cấp một lưới có kích thước h * w. Mỗi ô trong lưới có một giá trị cụ thể được gán cho nó. Chúng ta phải tối đa hóa các ô có giá trị chẵn. Để làm điều đó, chúng ta có thể chọn một ô chưa được chọn trước đó, sau đó giảm giá trị của 1 ô hiện tại và tăng giá trị của 1 ô khác nằm theo chiều dọc hoặc chiều ngang liền kề với ô hiện tại. Chúng tôi in ra số lượng các phép toán và số ô của các phép toán tăng và giảm. Đầu ra sẽ có định dạng bên dưới -
-
số lượng hoạt động
-
Thứ nhất (giảm vị trí ô) - (tăng vị trí ô)
....
-
thứ n (giảm vị trí ô) - (tăng vị trí ô)
Vì vậy, nếu đầu vào là h =3, w =3, grid ={{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}, thì đầu ra sẽ là
4 (0, 1) - (0, 2) (2, 0) - (2, 1) (2, 1) - (2, 2) (0, 2) - (1, 2)Các bước
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
Xác định kết quả mảng mới có chứa tuplefor khởi tạo i:=0, khi i0, then:insert tuple (i, j - 1, i, j) vào cuối kết quả lưới [i, j]:=grid [i, j] + tp nếu lưới [i, j] mod 2 giống 1 và j 0, sau đó:chèn tuple (i - 1, w - 1, i, w - 1) vào cuối kết quả [i, w - 1]:=grid [i, w - 1] + tpif grid [i, w - 1] mod 2 giống với 1, sau đó:grid [i, w - 1]:=grid [i, w - 1] - 1tp:=1Otherwisetp:=0print (kích thước của kết quả) để khởi tạo i:=0, khi i Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#includeusing namespace std; void Giải (int h, int w, vector > grid) {vector > result; for (int i =0; i 0) {result.push_back (make_tuple (i, j-1, i, j)); lưới [i] [j] + =tp; } if (grid [i] [j]% 2 ==1 &&j 0) {result.push_back (make_tuple (i-1, w-1, i, w-1)); lưới [i] [w-1] + =tp; } if (grid [i] [w-1]% 2 ==1) {grid [i] [w-1] - =1; tp =1; } else tp =0; } cout <<(int) result.size () < (result [i]) <<"," < (kết quả [i]) <<")" <<"- (" < (kết quả [i]) <<"," < (kết quả [i]) <<") "; cout <<'\ n'; }} int main () {int h =3, w =3; vector > grid ={{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}; giải quyết (h, w, lưới); trả về 0;} Đầu vào
3, 3, {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}Đầu ra
4 (0, 1) - (0, 2) (2, 0) - (2, 1) (2, 1) - (2, 2) (0, 2) - (1, 2)