首页 > 试题广场 >

Butterfly

[编程题]Butterfly
  • 热度指数:21 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
给定一个n*m的矩阵,矩阵元素由X和O构成,请求出其中最大的由X构成的蝴蝶形状。
由X构成的蝴蝶形状的定义如下:
存在一个中心点,并且其往左上、左下、右上、右下四个方向扩展相同的长度(扩展的长度上都是X),且左上顶点与左下顶点、右上顶点与右下顶点之间的格子全由X填充。我们不在意在蝴蝶形状内部是X还是O。
例如:
    XOOOX
    XXOXX
    XOXOX
    XXOXX
    XOOOX
是一个X构成的蝴蝶形状。
    X
也是。

    XOOX
    OXXO
    OXXO
    XOXX
不是(不存在中心点)。


输入描述:
第一行两个整数n, m表示矩阵的大小(1 <= n, m <= 2000);
接下来n行,每行一个长度为m的字符串表示矩阵,矩阵元素保证由X和O构成。


输出描述:
一行一个整数表示最大的由X构成的蝴蝶形状的对角线的长度。
示例1

输入

5 5
XOOOX
XXOXX
XOXOX
XXOXX
XOOOX

输出

5
头像 cheeserish
发表于 2020-06-25 16:59:18
rdow[i][j]表示向右下连续'X'的个数ldow[i][j]表示(i,j)点向左下'X'连续的个数dow[i][j]表示向下'X'连续的个数那么(i,j)为左上顶点,则(i,k)为右上顶点 ;两点之间的距离为k-j+1;蝴蝶的两个翅膀边界长也为k-j+1那么对于符合题意的k满足下列条件min( 展开全文
头像 修补骑士
发表于 2025-04-26 20:09:13
修补骑士一看见题面就放弃的差不多了。这里主要是绝大多数人可能会惯性思维的认为是从中间开始,之后往四边扩展验证,明显实现起来太过麻烦并且时间复杂度过大,不过考虑构造的思路是没有错的 对于每一个点,我们考虑积累三个元素:向上的延伸,向左上的延伸与向右上的延伸,对于一个方格(假设为右下角),我们先找到向上 展开全文
头像 苟且的狮子
发表于 2020-07-16 15:58:01
动态规划 题意: 链接:https://ac.nowcoder.com/acm/problem/14294来源:牛客网 给定一个n*m的矩阵,矩阵元素由X和O构成,请求出其中最大的由X构成的蝴蝶形状。由X构成的蝴蝶形状的定义如下:存在一个中心点,并且其往左上、左下、右上、右下四个方向扩展相同的长度( 展开全文
头像 -符拉迪沃斯托克-
发表于 2021-08-19 12:23:02
对于一个蝴蝶,形状为正方形,只要左上角和右上角的点坐标确定,这个蝴蝶的大小和位置也随之确定。 那么只要枚举这两个点的坐标即可。 设三个数组: 分别表示点往下延伸、从左边延伸、从右边延伸所能到的最远距离,读入的时候顺手预处理即可。 然后枚举左上和右上点,那么翅膀宽度就是,并且一定是奇数。 而对于每个枚 展开全文