题目链接
比较水的一道题,只需要找到黑色细胞上下左右界就好。
A的代码
#include<stdio.h>
#include<string.h>
int main()
{
char s[100][100];
int i,j,n,m,flag = 0,max;
scanf("%d %d",&n,&m);
getchar();
int a = 0,b = 0,c = 2100,d = 0;//分别代表上下左右界
for(i = 0;i < n;i++)
{
scanf("%s",s[i]);
for(j = 0;j < m;j++)
{
if(s[i][j] == 'B')
{
flag++;
b = i; //只要出现B我就可以更新b
if(j < c)
c = j; //更新左界,c刚开始要开大一点
if(j > d)
d = j; //右边的界限
if(flag == 1) //如果是第一次出现的B,那么上界就确定了
a = i;
}
}
}
int x;
x = b-a+1; //上下界之差
int y;
y = d-c+1; //左右界之差
if(x > y)
max = x; //找到其中最大的一个,因为要形成一个正方形
else
max = y;
if(max > m || max > n) //这个最大值如果大于矩阵的长或宽肯定是不满足的
printf("-1\n");
else if(flag == 0) //没有出现过B,只需要涂一个
printf("1\n");
else
printf("%d",max*max-flag);
return 0;
}
额,这道题写的时候WA了,WA的代码和A的代码只有下面这个部分有区别
为什么这里这样写会WA呢,首先我们判断不能涂成正方形的思路应该是,上下界与左右界之间最大的大于矩阵的长或宽就不可以涂。
但是这个WA的代码的思路比较的是面积,所以如果出现下面这种情况就会卡掉。
这种情况输出应该是-1,明显看得出来a>c,但是我们如果比较面积的话,矩形的面积是明显大于a的平方的,所以比较面积的话是可以放得下的。