解题思路:
遍历每个点,依次对当前点往右下角拓展一个单位,也就是把边长增加一个单位,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分
15 人评分
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:628 |
母牛的故事 (C语言代码)浏览:594 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:537 |
字符串输入输出函数 (C语言代码)浏览:2604 |
简单的a+b (C语言代码)浏览:1024 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:724 |
时间转换 (C语言代码)浏览:697 |
小O的图案 (C语言代码)浏览:979 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:826 |
小O的乘积 (C++代码)浏览:796 |