和书上的思路是一样的,不再赘述了,每一次处理矩阵的一行,更新当前的lo, ro, up, left, right五个数组,然后更新最大的面积数值,其中前面五个一维数组的数值都是递推出来的,不要用迭代方式去遍历一维数组得出五个数组的数值,本题使用一维数组即可,使用二维数组比较耗空间。
#include <stdio.h>
#include <string.h>
char arr[1002];
int lo[1002];
int ro[1002];
int up[1002];
int left[1002];
int right[1002];
int m, n;
char buf[1005];
int max_area;
int _max(int a, int b){
return a>b ? a : b;
}
int _min(int a, int b){
return a<b ? a : b;
}
void init(){
int j;
max_area = 0;
for(j=1; j<=n; j++){
up[j] = 0;
left[j] = 0;
right[j] = n+1;
}
}
void update(){
int j, area;
lo[0] = 0;
for(j=1; j<=n; j++){
if('F' == arr[j])
lo[j] = lo[j-1];
else
lo[j] = j;
}
ro[n+1] = n+1;
for(j=n; j>=1; j--){
if('F' == arr[j])
ro[j] = ro[j+1];
else
ro[j] = j;
}
for(j=1; j<=n; j++){
if('F' == arr[j])
up[j]++;
else
up[j] = 0;
}
for(j=1; j<=n; j++){
if('F' == arr[j]){
left[j] = _max(left[j], lo[j]+1);
right[j] = _min(right[j], ro[j]-1);
}
else{
left[j] = 0;
right[j] = n+1;
}
}
for(j=1; j<=n; j++){
area = up[j] * (right[j]-left[j]+1);
if(area > max_area)
max_area = area;
}
}
int main(void){
int case_n;
int i, j;
//freopen("input.dat", "r", stdin);
scanf("%d", &case_n);
while(case_n--){
scanf("%d %d", &m, &n);
init();
for(i=1; i<=m; i++){
for(j=1; j<=n; j++){
scanf("%s", buf);
arr[j] = buf[0];
}
update();
}
printf("%d\n", max_area*3);
}
return 0;
}