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来表示这种情况。

AC 记录

AC 记录

posted @ 2022-01-26 16:31  Shunpower  阅读(71)  评论(0编辑  收藏  举报