描述

童年的我们,充满了新奇的想法。这天,小朋友们用彩虹画笔在云霞上绘制了世界上最美丽的图画。那描绘的是一条大河波浪宽,风吹稻花香两岸的情景。欣赏着自己的作品,小朋友们别提多开心了。这时,Q小朋友对C小朋友说:你看,河面上那一弯弯船儿,多漂亮啊!可是,这么多船儿,哪一只最大呢?
    C小朋友最在意他在Q小朋友心目中的形象了,当然想完美地回答这个问题了。你能帮帮他么?
    船的定义为:中间是长宽比例为1:2的矩形,两头是两个等腰直角三角形的等腰梯形。注意:必须保证在船所占据的矩形中除了船的图形外都是空白,见样例。

输入格式

第一行两个数n、m,表示云霞的长宽
以下n行,每行m个字母,表示图案。0表示空白,1表示有图案。

输出格式

第一行两个数x、y,表示找到的最大的船的左上角的坐标。
以下若干行若干列,为找到的图形。
注意:在(9,22)点起始的图形是合法的最小的船。如果不存在船,输出:'Oh,my god!'。如果多解,输出最靠上的一个。如果仍多解,输出最靠左的一个。

测试样例1

输入

10 30 
000000000000000000000000000000 
000000000001111111111111100000 
000000000000111111111111000000 
000000000000011111111110100000 
000000000000001111111100000000 
000000000000000000000000000000 
001111111111000000000000000000 
000111111110000000000000000000 
000011111100000000000111111000 
000000000000000000000011110000

输出

7 3 
1111111111 
0111111110 
0011111100

备注

【限制】
20%的数据,n<=10,m<=10
40%的数据,n<=100,m<=100
60%的数据,n<=500,m<=500
100%的数据,n<=2000,m<=2000
【样例解释】
尽管以(2,12)起始有个更大的“船”,但是由于(4,25)这个该“船”占据的矩形中的点不是空白,该船不合法。所以答案是左上角坐标为(7,3)的船。由SRC原创

 
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
const int N=;
int n,m,a[N][N],b[N][N],c[N][N],d[N][N],e[N][N],f[N][N],g[N][N],h[N][N],ans,sy,sx;
char map[N][N];
void read()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%s",map[i]+);
}
void go()
{
//以i,j为左下角的1三角形的大小 checked
for(int j=;j<=m;j++)
if(map[][j]=='') a[][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(map[i][j]=='') a[i][j]=min(a[i-][j],a[i-][j+])+; //以i,j为左下角的0三角形的大小 checked
for(int j=;j<=m;j++)
if(map[][j]=='') b[][j]=;
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
if(map[i][j]=='') b[i][j]=min(b[i-][j+],b[i][j+])+; //以i,j为右下角的1三角形的大小 checked
for(int j=;j<=m;j++)
if(map[][j]=='') c[][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(map[i][j]=='') c[i][j]=min(c[i-][j-],c[i-][j])+; //以i,j为右下角的0三角形的大小 checked
for(int j=;j<=m;j++)
if(map[][j]=='') d[][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(map[i][j]=='') d[i][j]=min(d[i-][j-],d[i][j-])+; //以i,j为右下角的1正方形的大小 checked
for(int j=;j<=m;j++)
if(map[][j]=='') e[][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(map[i][j]=='') e[i][j]=min(min(e[i-][j],e[i][j-]),e[i-][j-])+; //以i,j为左下角的1正方形的大小 checked
for(int j=;j<=m;j++)
if(map[][j]=='') f[][j]=;
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
if(map[i][j]=='') f[i][j]=min(min(f[i-][j],f[i][j+]),f[i-][j+])+; //checked
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(b[i][j+]!=) b[i][j+]++;
g[i][j]=min(a[i][j],b[i][j+]);
if(d[i][j-]!=) d[i][j-]++;
h[i][j]=min(c[i][j],d[i][j-]);
}
//c为以i,j为右下角的直角梯形,d为以i,j为左下角的直角梯形
memset(c,,sizeof c);
memset(d,,sizeof d);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
a[i][j]=min(g[i][j],e[i][j]);
b[i][j]=min(h[i][j],f[i][j]);
if(a[i][j]!=) c[i][j-a[i][j]+]=a[i][j];
if(b[i][j]!=) d[i][j+b[i][j]-]=b[i][j];
} for(int i=;i<=n;i++)
for(int j=;j<m;j++)
{
int sk=min(c[i][j+],d[i][j]);
if(sk>ans)
{
ans=sk;
sx=i-ans+;
sy=j-ans-ans+;
}
} if(ans!=)
{
printf("%d %d\n",sx,sy);
for(int i=sx;i<=sx+ans-;i++)
{
for(int j=sy;j<=sy+*ans-;j++)
printf("%c",map[i][j]);
printf("\n");
}
}
else printf("Oh,my god!\n");
}
int main()
{
read();
go();
system("pause");
return ;
}

tyvj1148 小船弯弯的更多相关文章

  1. CentOS 7主机名的弯弯绕绕

    在CentOS 6中,修改主机名方式很简单,临时修改主机名使用hostname命令,永久修改主机名直接写进文件/etc/sysconfig/network中即可. 但在CentOS 7中,主机名就没那 ...

  2. 海盗船长小米首页小船来回摆动CSS3.0效果

    海盗船长小米首页小船来回摆动CSS3.0效果,偶然之间看到的,就写了一个. <!DOCTYPE html> <html lang="en"> <hea ...

  3. 坐上JDK8时间SDK的小船,带你遨游UNIX时间戳与时区的小太空~

    原文链接:坐上JDK8时间SDK的小船,带你遨游UNIX时间戳与时区的小太空- 一.背景: 最近有一个关于店铺数据实时分析的需求,需要实时统计店铺当天的数据:例如访客数,浏览量.商品排行榜等.由于店铺 ...

  4. 7个连环问揭开java多线程背后的弯弯绕

    摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...

  5. 关于Unity中的小案例之运动的小船以及摄像机跟随技术(专题五)

    实例步骤 1.创建Unity项目和文件目录,保存场景 场景搭建 2.导入美术做好的资源包(第68) a: 导入地形资源包terrain.unitypackage,把里面的Map/Prefabs/Ter ...

  6. “fixed+relative==absolute”——对BFC的再次思考

    好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...

  7. Android中的自定义控件(二)

    案例四: 自定义开关       功能介绍:本案例实现的功能是创建一个自定义的开关,可以自行决定开关的背景.当滑动开关时,开关的滑块可跟随手指移动.当手指松开后,滑块根据开关的状态,滑到最右边或者滑到 ...

  8. ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  9. Atitit 教育与培训学校 的计划策划 v4 qc18

    Atitit 教育与培训学校 的计划策划 v4 qc18 1.1. 版本历史12. 教育历史的前世今生12.1. 自学vs 家庭学校vs 私立学校vs 公立学校模式 vs 企业内部学校 vs 其他商业 ...

随机推荐

  1. 1、linux网络服务实验 用PuTTY连接Linux

    这个是大三下学期的Linux网络服务配置详解时,感觉老师上得简单,就整理下,岭南师范学院师弟妹有福,如果是蔡老师交的话,可以拿来预习,复习. 一.用PuTTY连接Linux ①.装有redhat系统的 ...

  2. TAR,JAR,Zip的使用

    在文件归档的时候,LINUX中,我常喜欢使用tar,它可以把一个文件夹归档为一个文件,可以同时使用指定的压缩算法把其压缩归档. 最常用的语句是: tar cvzf target.tar.gz sour ...

  3. FineReport实现根据点击次数奇偶性排序的方法

    使用FineReport报表软在进行排序的时,很多时候您可能想实现根据点击的次数进行升降序排序,也就是说点击第一次点击标题升序排序,再次点击就降序,以此类推,而不是通过选择升序进行升序排列,选择降序进 ...

  4. Spring远程调用技术<3>-Spring的HTTP Invoker

    前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙.  另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...

  5. 通过端口 8080 连接到主机 localhost 的 TCP/IP 连接失败

    错误:“connect timed out.请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接.”这 ...

  6. GNU make使用变量⑤变量的引用、定义等

    在 Makefile 中,变量是一个名字(像是 C 语言中的宏),代表一个文本字符串(变量的值).在 Makefile 的目标.依赖.命令中引用变量的地方,变量会被它的值所取代(与 C 语言中宏引用的 ...

  7. nvl函数 oracle

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  8. on事件委托

    on绑定多个事件,off解绑事件,one事件只执行一次 on除了能够处理未来事件,还可以对事件进行委托处理 $('div').on('click', 'p', function(event)(也就是通 ...

  9. Java基础知识总结

    写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技 ...

  10. node基础13:异步流程控制

    1.流程控制 因为在node中大部分的api都是异步的,比如说读取文件,如果采用回调函数的形式,很容易造成地狱回调,代码非常不容易进行维护. 因此,为了解决这个问题,有大神写了async这个中间件.极 ...