- 题目
题目描述
Alice在玩一个游戏,她在一个m×n的格子里,随机涂黑k个格子。然后她每次可以把一行或者一列的格子染成红色,但是这一行中不能有黑色的格子。 请问她最多能把多少个格子涂成红色?
输入
第一行是一个整数T(T≤100),表示样例的个数。 每个样例的第一行是m(1≤m≤100),n(1≤n≤100),k(0≤k≤m×n)。 以后的k行,每行两个整数x(1≤x≤m),y(1≤y≤n),表示(x,y)为黑色格子。
输出
每行输出一个样例的结果。
样例输入
1
3 4 2
1 1
3 3
样例输出
8
- 解法
我的解法很暴力,可以发现这一行和这一列都有黑格子的或者本身就是黑格子的就不能涂红色,其他都可以。用bool的数组存放数据,然后利用规律直接暴力解决。代码如下。
#include <cstdio>
#include <cstring>
using namespace std;
bool b[101][101];
int T, m, n, k;
bool canColor(int x, int y) {
if(b[x][y] == false)
return false;
else
for(int i = 1; i <= n; i++)
if(b[x][i] == false)
for(int j = 1; j <= m; j++)
if(b[j][y] == false)
return false;
return true;
}
int main(int argc, char const **argv) {
int x, y;
int sum = 0;
scanf("%d", &T);
memset(b, 1, sizeof(b));
while(T--) {
scanf("%d%d%d", &m, &n, &k);
for(int i = 0; i < k; i++) {
scanf("%d%d", &x, &y);
b[x][y] = false;
}
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
if(canColor(i, j))
sum++;
printf("%d\n", sum);
sum = 0;
memset(b, 1, sizeof(b));
}
return 0;
}