花坛 题目描述: 小明有一张N*M(2≤N≤30,2≤M≤30)的方格纸,且每个小方格都是正方形,纸上的每个小方格中都画了一个花朵,共有a、b、c三种不同的花朵。为了美观现按照以下要求为花朵涂色。 要求: 1)涂色的花朵区域必须是一个正方形矩阵,最小为一个2*2的正方形矩阵; 2)正方形矩阵中的花朵必须是同一种花朵; 3)只要正方形矩阵四个顶点不重合就算作不同的正方形矩阵(有部分区域重叠或者大正方形矩阵包含小正方形矩阵,按不同的正方形矩阵计算)。 已知方格纸的行数N(2≤N≤30)和列数M(2≤M≤30),及每个小正方形方格中花朵的种类,请帮助小明计算出,按要求有多少个正方形矩阵需要涂色。 例如:N=4,D = 5,矩阵如下图: 其中有3个正方形矩阵需要涂抹颜料(蓝色框区域和绿色区域的矩阵部分重叠按2个计算)。 输入描述: 第一行输入两个正整数N(2≤N≤30)和M(2≤M≤30),N表示矩阵方格的行数,M表示矩阵方格的列数,两个正整数之间以一个空格隔开 第二行开始输入N行,每行M个字符(字符只包含a、b、c),字符之间以一个空格隔开 输出描述: 输出一个整数,表示N*M的矩阵方格纸中,需要涂抹颜料正方形矩阵的个数 样例输入: 4 5 b b c b a b b a c b c b a a a a b a a a 样例输出: 3

正确答案:枚举每个左上角(i,j)与边长s≥2,判断s×s内字符是否全等于g[i][j],全等则计数(N,M≤30直接枚举):\nfor s in range(2,min(n-i,m-j)+1):\n if all(g[i+di][j+dj]==g[i][j]for di in range(s)for dj in range(s)):ans+=1
答案解析
评分标准:
4分:能正确输出第一组数据;
4分:能正确输出第二组数据;
4分:能正确输出第三组数据;
4分:能正确输出第四组数据;
4分:能正确输出第五组数据;
5分:能正确输出第六组数据。
试卷来源:202301(第14届)蓝桥杯C++编程青少组(选拔赛_中高级)真题