题解:P12242 [蓝桥杯 2023 国研究生组] 钉板上的正方形
weifengzhaomi · · 题解
写蓝题绿题题解没过,愤恨恨来写黄题题解我没不信过不了了。
前记:本人在一开始算的时候没考虑到部分方块,截止目前,有三分之一是我提交的了。
题意:
本题给了我们一个钉板,要我们算出一共有多少个大小不一的正方形。
为了方便处理,我们可以把钉板存入数组中。
为了方便,我们设
const int s[10][10] = {
{1,1,0,1,0,1,1,1,1,1},
{1,1,1,0,0,1,1,1,1,0},
{1,1,0,0,1,0,1,1,1,1},
{1,0,1,1,0,1,1,1,1,0},
{1,0,1,0,1,1,1,1,0,0},
{1,0,0,1,0,1,0,1,0,1},
{1,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,1,1,0,1,0,1,1,1,1},
{1,0,1,0,0,1,0,1,0,0}
// 1就是有钉子,0就是没有
};
思路:
思路 1.0:
可以发现,这个钉板只有
于是我们可以手算,然后提交答案。
时间复杂度
思路 2.0:
什么?要手算?我从来不手算。
但是手算有点麻烦,我们可以用编程来计算。
枚举每个顶点,然后判断 4 个角是不是都有钉子。
然后统计答案。
时间复杂度
思路 3.0:
然而枚举四个角不但浪费了很多时间,还有很多本身就不是一个正方形的,这个时候要怎么办?
我们可以换一种思路,枚举正方形的每条边,然后枚举当前的位置,判断四个角有没有顶点,有的话更新一下答案。
时间复杂度
最终在各种思路的推算下,得出答案为
虽然这道题思路 1 和 2 就可以过了,但是我们还是进行了优化,尽管没有任何意义,但是也可以提升一下思维,说不定在以后就有的能用得上呢。