Giả sử chúng ta có hai số r, c và một lưới kích thước n x m. Một số ô có màu đen và còn lại là màu trắng. Trong một thao tác, chúng ta có thể chọn một số ô màu đen và có thể thực hiện chính xác một trong hai thao tác này -
- Tô màu tất cả các ô trong hàng của nó là màu đen hoặc
- tô màu tất cả các ô trong cột của nó là màu đen.
Chúng ta phải tìm số phép toán tối thiểu cần thiết để làm cho các ô trong hàng r và cột c có màu đen. Nếu không thể, hãy trả về -1.
Vì vậy, nếu đầu vào giống như
| W | B | W | W | W |
| B | B | B | W | B |
| W | W | B | B | B |
r =0 và c =3
thì đầu ra sẽ là 1, vì chúng ta có thể thay đổi hàng đầu tiên để làm cho hàng này giống như -
| B | B | B | B | B |
| B | B | B | W | B |
| W | W | B | B | B |
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 -
n := row count of grid m := column count of grid ans := inf for initialize i := 0, when i < n, update (increase i by 1), do: for initialize j := 0, when j < m, update (increase j by 1), do: if matrix[i, j] is same as 'B', then: ans := minimum of ans and (1 if i and r are different, otherwise 0) + (1 if j and c are different, otherwise 0) if ans > 2, then: return -1 Otherwise return ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <bits/stdc++.h>
using namespace std;
int solve(vector<vector<char>> matrix, int r, int c) {
int n = matrix.size();
int m = matrix[0].size();
int ans = 999999;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (matrix[i][j] == 'B') {
ans = min(ans, (i != r) + (j != c));
}
}
}
if (ans > 2) {
return -1;
}
else
return ans;
}
int main() {
vector<vector<char>> matrix = { { 'W', 'B', 'W', 'W', 'W' }, { 'B', 'B', 'B', 'W', 'B' }, { 'W', 'W', 'B', 'B', 'B' } };
int r = 0, c = 3;
cout << solve(matrix, r, c) << endl;
} Đầu vào
{ { 'W', 'B', 'W', 'W', 'W' }, { 'B', 'B', 'B', 'W', 'B' }, { 'W', 'W', 'B', 'B', 'B' } }, 0, 3 Đầu ra
1