原题链接:蓝桥杯算法训练VIP-暗恋
解题思路:
遍历每个点,依次对当前点往右下角拓展一个单位,也就是把边长增加一个单位,issame 函数用来判断当前颜色与拓展边的颜色是否一致,Offset为偏移总量,往上遍历就可以获取拓展边的颜色,遍历就能得出最大同色正方形的 Side length。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int Map[201][201];
bool issame(int posx, int posy, int Offset) {
/* 保存原颜色 */
int color = Map[posx][posy];
/* 往右下偏移一个单位 */
posx++; posy++;
/* 往上往左遍历拓展边 */
if (Map[posx][posy] != color)
return false;
for (int i = 1; i <= Offset; i++) {
if (Map[posx - i][posy] != color) return false;
if (Map[posx][posy - i] != color) return false;
}
return true;
}
int main() {
/* side是所求最大的边长 */
int high, width, side = 1;
cin >> high >> width;
/* Map存储 */
for (int i = 0; i < high; i++)
for (int d = 0; d < width; d++)
cin >> Map[i][d];
bool end = false;
/* 两层for遍历所有的点 */
for (int posx = 0; posx < high; posx++) {
for (int posy = 0; posy < width; posy++) {
/* 如果找到最大色块的边长已经比
该点余下的高度大就不用在找了 */
if (high - posx - 1 < side) {
end = true; break;
}
/* 如果找到最大色块的边长已经比
该点余下的宽度大就跳到下一行 */
if (width - posy - 1 < side)
continue;
/* Offset为在当前点往右下的偏移量 */
int Offset = 1, tempx = posx, tempy = posy;
while (tempx + 1 < high && tempy + 1 < width) { /* 边界条件 */
if (issame(tempx, tempy, Offset)) { /* 函数功能见上 */
tempx++; tempy++; Offset++; /* 更新状态 */
if (Offset > side) side = Offset; /* 更新最大边长 */
}
else
break;
}
}
if (end == true)
break;
}
cout << side*side << endl;
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复