题意介绍
题意分析
一开始打算开二维数组,结果发现需要的空间太大,不可行,只能将二维数组映射到一维数组,然后求出每一行以及每一列白色格子的数目,然后行列进行两两组合求得符合条件的行和列,注意如果白色格子出现在行列的交汇处,还要减一。
通过代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 400001
#define inf 0x3f3f3f3f
char c[maxn];
int col[maxn], row[maxn], q,n, m;
int main() {
cin >> q;
while (q--) {
cin >> n >> m;
for (int i = 0; i < n; i++) cin >> c+i*m;
for (int i = 0; i < n; i++) {
row[i] = 0;
for (int j = i * m; j < (i + 1)*m; j++) {
if (c[j] == '.')
row[i]++;
}
}
for (int i = 0; i < m; i++) {
col[i] = 0;
for (int j = i; j < n*m; j += m) {
if (c[j] == '.')
col[i]++;
}
}
int minn = inf;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int temp = row[i] + col[j];
if (c[i*m + j] == '.') temp--;
minn = min(minn, temp);
}
}
cout << minn << endl;
}
}