这次是真的考炸了
一.繁星(star)
1.题目
【问题描述】
要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢。突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑。像素(x,y)处是一颗星星,当且仅当,像素(x,y),(x-1,y),(x+1,y),(x,y-1),(x,y+1)都是白色的。因此一个白色像素有可能属于多个星星,也有可能有的白色像素不属于任何一颗星星。但是这张照片具有研究价值,所以大川不想把整张照片都送给小伙伴,而只准备从中裁下一小块长方形照片送给他。但为了保证效果,大川认为,这一小块相片中至少应该有k颗星星。
现在大川想知道,到底有多少种方法裁下这一小块长方形相片呢?
【输入格式】
输入的第一行包含三个正整数n,m,k,意义见题目所示。
接下来n行,每行一个长度为m的字符串,字符串仅由'.'和'*'构成,'.'表示这个像素为黑色,'*'表示这个像素为白色。
【输出格式】
输出的第一行包含一个整数,表示大川有多少种满足题意的裁剪方法。
【样例输入】
5 6 3
***...
****..
.**.*.
******
.*.***
【样例输出】
3
2.题解
这道题的难点就是在于确定要裁剪的矩形,并统计里面的星星个数,这是我们重点讨论的。
首先,我们想要统计里面的星星个数,可以先用类似前缀和的东西,统计以点(x, y)和点(1, 1)为左下和右上端点的矩形内的星星个数(其实只用统计星星的中心就行了)。
然后,我们想,一个矩形是由上下左右四条边组成的,那不妨我们先根据要求拥有的星星个数k来确定矩形的上下两条边,再确定左右两条边,就一个的算法,能过的。
具体说一下确定矩形四条边时的过程:
首先一个循环枚举最上面的边(0~n-1)
再从最上面那条边的下面一条边开始往下枚举,只要上下两条边之间有k颗星星就行了。
再枚举左边的那条边(0~m-1)
最后从左面的那条边的后一条边开始枚举,只要整个矩形一有k颗星星&