Cho ma trận N x N chỉ chứa 0 và 1. Mỗi phép phép trao đổi 2 hàng bất kỳ hoặc 2 cột bất kỳ. Tìm số phép tối thiểu để biến thành bàn cờ (xen kẽ 0,1). Không thể thì trả về -1.
Điều kiện cần đủ
- Mọi hình chữ nhật 2x2 phải có XOR 4 góc = 0 (tức là số 1 chẵn).
- Số 1 trên hàng đầu và cột đầu phải bằng
N/2hoặc(N+1)/2.
Tính số phép trao đổi
- Đếm
rowSwap: số hàng đầu tiên khác với mẫu xen kẽ (0,1,0,1...). - Đếm
colSwap: số cột đầu tiên khác với mẫu xen kẽ. - Nếu N lẻ: số phép phải chẵn, điều chỉnh
rowSwap = min(rowSwap, N-rowSwap)tương tự cột. - Kết quả =
(rowSwap + colSwap) / 2.
Chương trình C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int movesToChessboard(vector<vector<int>>& b) {
int n = b.size();
// Kiểm tra điều kiện XOR
for(int i=0; i