描述

童年的我们,充满了新奇的想法。这天,小朋友们用彩虹画笔在云霞上绘制了世界上最美丽的图画。那描绘的是一条大河波浪宽,风吹稻花香两岸的情景。欣赏着自己的作品,小朋友们别提多开心了。这时,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. 使用Vmware虚拟机部署开发环境之Mac OS X系统安装

    一.使用VMware虚拟机部署Swift开发环境所需工具: Vmware Workstation 10.0虚拟机软件 VM安装Mac解锁工具Unlock 苹果操作系统(Mac OS X Maveric ...

  2. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  3. NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  4. on事件委托

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

  5. 人民币符号在html的显示方法

    之前做页面的时候碰到一个问题——人民币符号 (¥) 的显示问题,IE6下特别明显. font-size:12px;的时候显示没有问题,但是一旦大于12px就会显示异常. 于是上网查了一下看有什么方法不 ...

  6. ReactNative新手学习之路04 组件化开发轮播图swiper支持安卓和IOS

    react native 新手之路04 组件化开发轮播图swiper支持安卓和IOS npm install react-native-carousel --save git 地址Properties ...

  7. 如何重新划分linux分区大小

    1.下载脚本文件,将脚本文件内容复制 chmod +x resize.sh sudo ./resize.sh 输入上面命令后会看到下面的结果 root@odroid:~# sudo ./resize. ...

  8. 终于等到你---订餐系统之负载均衡(nginx+memcached+ftp上传图片+iis)

    又见毕业 对面工商大学的毕业生叕在拍毕业照了,一个个脸上都挂满了笑容,也许是满意自己四年的修行,也许是期待步入繁华的社会... 恰逢其时的连绵细雨与满天柳絮,似乎也是在映衬他们心中那些离别的忧伤,与对 ...

  9. Nhibernate Query By Criteria 条件查询

    HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictio ...

  10. Asp.Net Core 项目搭建 基础配置 和MySql 的使用

    一.开发环境准备 1.安装Visual Studio 2015,我这里安装的是专业版. 2.安装.NET Core SDK相关 需要安装  Visual Studio 2015 update3和NET ...