CF1627A Not Shading 题解
前情提要
个人认为,本题是 CF1280B 的弱化,如果您切掉了这道题,可以去尝试尝试。
思路
分类讨论。
- \((r,c)\) 本身是一个黑块。显然,答案为 \(0\)。
- 有至少一个黑块与 \((r,c)\) 同行或同列,显然对这个黑块操作 \(1\) 次即可。
- 不符合以上两种情况,但整个网格中有黑块。显然对于这个黑块先横向或竖向操作一次,就可以变成情况二。因此答案为 \(2\)。
- 整个网格里都没有黑块,那么无解。
想清楚问题之后,代码就非常轻松了。
代码
情况一和情况四非常容易,只给出情况二和情况三的参考。
3.1 判断情况二
使用一个标记,对于第 \(r\) 行找一次,第 \(c\) 列又找一次,找到黑块就打标记,最后看一下标记有没有被打上即可:
bool check2(){
int f=0;
fr1(i,1,n){
if(a[i][c]=='B'){
f++;
}
}
fr1(i,1,m){
if(a[r][i]=='B'){
f++;
}
}
if(f){
return true;
}
return false;
}
3.2 判断情况三
发现情况三不太好判,但是我们都会判一、二、四了,所以可以直接else
。
if(a[r][c]=='B'){
cout<<"0"<<endl;
}
else if(check1()){
cout<<"-1"<<endl;
}
else if(check2()){
cout<<"1"<<endl;
}
else{
cout<<"2"<<endl;
}
//在分类讨论题目中,
//如果遇到了不容易判断的情况,
//可以先想想别的情况怎么判,
//如果别的情况好判,
//可以用else来表示这种情况。