描述

童年的我们,充满了新奇的想法。这天,小朋友们用彩虹画笔在云霞上绘制了世界上最美丽的图画。那描绘的是一条大河波浪宽,风吹稻花香两岸的情景。欣赏着自己的作品,小朋友们别提多开心了。这时,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. jquery选择器demo

    大部分选择器都是基于下面这个简单的页面: <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  2. Eclipse导入MyEclipse创建的web项目报错的解决方法

    将myeclipse中开发的动态web项目直接引入到eclipse中继续开发,Eclipse中会报项目有错,如下图

  3. oracle异常(-)

    一.概述异常分成三大类:预定义异常.非预定义异常.自定义异常处理方法分为:直接抛出异常.内部块处理异常.游标处理异常 预定义异常:由PL/SQL定义的异常.由于它们已在standard包中预定义了,因 ...

  4. java读取excel文件

    package com.execl; import java.io.File; import java.io.FileInputStream; import java.io.IOException; ...

  5. simpleCart的简单使用及配置

    simpleCart的功能就不用解释,购物车,很6.官网上的说明太模糊了,还是GIHUb上的好一点:https://github.com/wojodesign/simplecart-js/ 文章解决问 ...

  6. BBR拥塞控制算法

    BBR拥塞控制算法是Google最新研发的单边TCP拥塞控制算法Linux 内核4.9 已引入这个BBR算法,本人在CAC测试Ubuntu 14.04 安装Linux 4.9内核,延迟优化效果和TCP ...

  7. 使用TaskManager爬取2万条代理IP实现自动投票功能

    话说某天心血来潮想到一个问题,朋友圈里面经常有人发投票链接,让帮忙给XX投票,以前呢会很自觉打开链接帮忙投一票.可是这种事做多了就会考虑能不能使用工具来进行投票呢,身为一名程序猿决定研究解决这个问题. ...

  8. jquery easy ui datagrid中遇到的坑爹的問題。。。

    ; //修改 function Update() { //獲取選中行 var selected = $("#dg1").datagrid('getSelected'); //判斷是 ...

  9. RGW 负载均衡和高可用的几个方案对比

    注:在RGW网关主机网卡已经是10Gb的情况下,如下三个方案没有引入LVS:如果RGW是Gb网卡,可以考虑引入LVS做流量负载均衡. RGW部署采用 fastcgi+nginx 扩展性和可配置性更强. ...

  10. JDK历史版本

    http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html