描述:
这里有n行m列的表格,一些单元格的颜色是黑色的,其他的单元格是白色的。
一步操作,你可以选择黑色的单元格做以下操作:
它所在的行全部变成黑色
或者它所在的那一列全部变成黑色。
给你两个整数r和c.找到最少的操作数,使得r行c列的单元格变成黑色,或者判断那是不可能的。
输入:
输入由多组测试数据组成,第一行包含一个整数t(1≤t≤1001≤t≤100) —测试组数。
测试数据描述如下:
每组测试数据的第一行包含四个整数n,m,r和c(1≤n,m≤50;1≤r≤n;1≤c≤m) —表格中的行数和列数,你要将其变黑的那个单元格的行数和列数。
然后,接下来有n行,每行包含m个字母,每个字母是‘B’或‘W’,分别代表黑色和白色的单元格。
输出:
对于每组测试数据,如果不可能把r行c列的单元格变黑,输出-1,否则,输出单个整数--使得r行c列的单元变黑的最少操作数。
生词:
cell 单元格;细胞
respectively.分别;各自
注释:
第一组测试数据如下:
(题图)
我们可以对1行2列的数进行操作,使得它所在行的所有单元格变黑,因此,1行4列的单元格将变黑。
第二组测试数据,2行1列的单元格已经是黑色的。
第三组测试数据,不可能将2行2列的单元格变黑。
第四组测试数据如下图:
参考代码:
#include<stdio.h>
#include<cstdlib>
#include<cstring>
int main()
{
int t,m,n,r,c;
char a[65][65],x;
int i,j,flag;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&m,&n,&r,&c);
scanf("%c",&x);
flag=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='B')
flag=1;
}
scanf("%c",&x);
}
if(a[r][c]=='B')
printf("0\n");
else if(flag==0)
printf("-1\n");
else{
for(j=1;j<=n;j++)
{
if(a[r][j]=='B')
{
flag=0;
printf("1\n");
break;
}
}
if(flag==1)
for(i=1;i<=m;i++)
{
if(a[i][c]=='B')
{
flag=0;
printf("1\n");
break;
}
}
if(flag==1)
printf("2\n");
}
}
return 0;
}
我们可以将2行2列单元格所在的列中的所有单元格变成黑色,然后我们可以将1行2列的黑色单元格所在的行变成黑色,因此,1行1列的单元格变成黑色。