题目大意:给出棋盘大小(p*p),给出障碍区域数目,每个障碍区以两个点坐标形式确定,输出最大可用区域面积。
解题策略:将障碍区以0标记,可用区以1标记,然后解法同UVA 10074 Take the Land(传送门:http://blog.csdn.net/j_dark/article/details/8700390)。
/*
UVA 10667 Largest Block
AC by J.Dark
ON 2013/3/21
Time 0.016s
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 105;
int chessBoard[maxn][maxn];
int line_Board, Num_Block, a1, a2, b1, b2;
void mark(int a1, int b1, int a2, int b2){
for(int i=a1; i<=a2; i++){
for(int j=b1; j<=b2; j++){
chessBoard[i][j] = 0;
}
}
}
int max_sum(int *b, int *chessBoard, int len_colu){
int max = 0;
int temp = 0;
for(int i=1; i<=line_Board; i++) b[i] += chessBoard[i];
for(int i=1; i<=line_Board; i++){
if(b[i] != len_colu){
temp = 0;
continue;
}
temp += b[i];
if(temp > max) max = temp;
}
return max;
}
//求最大01子矩阵和
void solve(){
int maxNum = 0, b[maxn];
int temp = 0;
for(int i=1; i<=line_Board; i++){
memset(b, 0, sizeof(b));
for(int j=i; j<=line_Board; j++){
temp = max_sum(b, chessBoard[j], j-i+1);
maxNum = max(maxNum, temp);
}
}
cout << maxNum << endl;
}
//输入
void input(){
cin >> line_Board >> Num_Block;
//默认棋盘全是1,即无任何障碍物
for(int i=1; i<=line_Board; i++){
for(int j=1; j<=line_Board; j++)
chessBoard[i][j] = 1;
}
while(Num_Block--)
{
cin >> a1 >> b1 >> a2 >> b2;
//以0标记障碍物区域
mark(a1, b1, a2, b2);
}
}
//
int main(){
int testCase;
while(cin >> testCase)
{
while(testCase--)
{
input();
solve();
}
}
//system("pause");
return 0;
}