解题思路:

       遍历每个点,依次对当前点往右下角拓展一个单位,也就是把边长增加一个单位,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;
}


点赞(3)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论