tyvj1148 小船弯弯

描述

童年的我们,充满了新奇的想法。这天,小朋友们用彩虹画笔在云霞上绘制了世界上最美丽的图画。那描绘的是一条大河波浪宽,风吹稻花香两岸的情景。欣赏着自己的作品,小朋友们别提多开心了。这时,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=2010;
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=1;i<=n;i++) scanf("%s",map[i]+1);
}
void go()
{
//以i,j为左下角的1三角形的大小 checked
for(int j=1;j<=m;j++)
if(map[1][j]==‘1‘) a[1][j]=1;
for(int i=2;i<=n;i++)
    for(int j=1;j<=m;j++)
        if(map[i][j]==‘1‘) a[i][j]=min(a[i-1][j],a[i-1][j+1])+1;

//以i,j为左下角的0三角形的大小 checked
for(int j=1;j<=m;j++)
    if(map[1][j]==‘0‘) b[1][j]=1;
for(int i=2;i<=n;i++)
    for(int j=m;j>=1;j--)
        if(map[i][j]==‘0‘) b[i][j]=min(b[i-1][j+1],b[i][j+1])+1;

//以i,j为右下角的1三角形的大小 checked
for(int j=1;j<=m;j++)
    if(map[1][j]==‘1‘) c[1][j]=1;
for(int i=2;i<=n;i++)
    for(int j=1;j<=m;j++)
    if(map[i][j]==‘1‘) c[i][j]=min(c[i-1][j-1],c[i-1][j])+1; 

//以i,j为右下角的0三角形的大小 checked
for(int j=1;j<=m;j++)
    if(map[1][j]==‘0‘) d[1][j]=1;
for(int i=2;i<=n;i++)
    for(int j=1;j<=m;j++)
        if(map[i][j]==‘0‘) d[i][j]=min(d[i-1][j-1],d[i][j-1])+1;

//以i,j为右下角的1正方形的大小 checked
for(int j=1;j<=m;j++)
    if(map[1][j]==‘1‘) e[1][j]=1;
for(int i=2;i<=n;i++)
    for(int j=1;j<=m;j++)
        if(map[i][j]==‘1‘) e[i][j]=min(min(e[i-1][j],e[i][j-1]),e[i-1][j-1])+1;

//以i,j为左下角的1正方形的大小 checked
for(int j=1;j<=m;j++)
    if(map[1][j]==‘1‘) f[1][j]=1;
for(int i=2;i<=n;i++)
    for(int j=m;j>=1;j--)
        if(map[i][j]==‘1‘) f[i][j]=min(min(f[i-1][j],f[i][j+1]),f[i-1][j+1])+1;

//checked
for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
if(b[i][j+1]!=0) b[i][j+1]++;
        g[i][j]=min(a[i][j],b[i][j+1]);
        if(d[i][j-1]!=0) d[i][j-1]++;
        h[i][j]=min(c[i][j],d[i][j-1]);
}
//c为以i,j为右下角的直角梯形,d为以i,j为左下角的直角梯形
memset(c,0,sizeof c);
memset(d,0,sizeof d);
for(int i=1;i<=n;i++)
    for(int j=1;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]!=0) c[i][j-a[i][j]+1]=a[i][j];
        if(b[i][j]!=0) d[i][j+b[i][j]-1]=b[i][j];
}

for(int i=1;i<=n;i++)
    for(int j=1;j<m;j++)
    {
int sk=min(c[i][j+1],d[i][j]);
if(sk>ans)
{
ans=sk;
sx=i-ans+1;
sy=j-ans-ans+2;
}
}

if(ans!=0)
{
printf("%d %d\n",sx,sy);
for(int i=sx;i<=sx+ans-1;i++)
{
    for(int j=sy;j<=sy+4*ans-3;j++)
        printf("%c",map[i][j]);
    printf("\n");
}
}
else printf("Oh,my god!\n");
}
int main()
{
read();
go();
system("pause");
return 0;
}
时间: 2024-10-11 12:19:50

tyvj1148 小船弯弯的相关文章

友谊的小船说翻就翻,谁还在和VMware同一条船?

去年十月份Dell对EMC约670亿美元的收购仍然在业内被人频频谈起,不过本着先看后说的态度一直没有发表评论,现在这场世纪收购已经过去差不多半年了,业内也有了不少的新变化,是时候坐下来来聊聊一下这场变革对业内,特别是对VMware公司的影响. 股价,人事变动 我们还是先来看看股价吧,这是最直接判断一家公司是否健康成长的标志.下图就是过去的七个月中VMware公司股价的变化. Dell对EMC的收购对VMware绝对不是一个好事情,从股价上看,VMware的股价从收购前的超过80美元/股直线跳水到

从多地商户抵制团购 看巨头“联盟小船”为何说翻就翻?

强强合并当下似乎已经成为国内互联网行业的风潮,滴滴和快的.美团和大众点评.58同城和赶集网.携程和去哪儿,乃至此前的优酷和土豆等,都是经典的案例.原本在细分互联网行业鼎力竞争的局面瞬间被打破,形成垄断趋势.为压缩成本.抢夺市场而结合的巨头,在坐上"联盟小船"之后,并没有像预料中的那样为互联网进步.创新做出贡献,反而是露出狰狞的獠牙,开始向平台上的参与者"嗜血啃食". 近段时间以来,多地团购商户开始公开抵制合并后的美团和大众点评.原因就在于两家公司合并之后,对平台上的

基于stm32的遥控小船(一)L298N电机驱动

L298N的资料网上一搜一大把……作为初学者的我最开始花了一下午在接线上,问题出在哪儿呢……就是跳帽!开始不清楚插拔跳帽之后有什么作用……结果浪费了很多时间. 我用的L298N模块上一共有三个跳帽,其中两个是使能端(ENA,ENB)当它插在上面的时候,使能ENA,ENB,若要PWM调速,需对使能端输出PWM脉冲.当使能端未使能(跳帽未插)的时候,电机为停止状态,当使能端使能的时候,电机为制动状态!然后IN1-4接板子的四个引脚,这里我用的从机板子是STM32RBT6的最小系统,引出了64脚.然后

微信整人游戏高级版 友谊的小船真会翻【微信高级教程5】

虽然愚人节已经过去好长一段时间了,但好友之间的整蛊游戏不会就这样结束.看好了,微信整人游戏高级版来了:在微信任意聊天窗口输入 //fullexit ,相当于退出功能,输入并发送后,微信会自动闪退到桌面!再次进入微信时,还需要输入登录密码!假使他真忘记密码不要来找ytkah哈,我也不知道他的微信密码. 看他在微信上撩妹心理很不是滋味?给他来一发,看他捉急得要跳起来的样子是不是很可爱?太损了,ytkah提醒您要注意控制好度,不然友谊的小船说翻真的就翻!三思而后行哈!

基于css3小船水面游动动画特效

基于css3小船水面游动动画特效,这是一款色彩鲜艳扁平风格的css3动画特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="land"> <div class="land_01"></div> <div class="land_02"></div> <div class="land_03"></div&g

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

海盗船长小米首页小船来回摆动CSS3.0效果,偶然之间看到的,就写了一个. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript</title> 6 <style type="text/css"> 7 *{margin:0px;paddi

人生做出的选择越多,友谊的小船翻得越快?

郑昀 创建于2016/4/29 最后更新于2016/5/5 关键词:选择,心血辩护,认知失调,职场,人生,宜家效应, 提纲: 人生做出的选择越多,友谊的小船翻得越快 新员工的试炼 先僵化后优化再固化 前言 年纪越来越大,为什么朋友越来越少?友谊的小船为什么这么容易翻? 人生的路为什么越走越窄? 百度员工为什么都认为百度不应该背武警二院的锅? 为什么说对新人要更加严格? 技法为什么比心法更重要? 这一切的背后,是人性的扭曲,还是必然的宿命? 今晚让我们一起走进认知失调的世界…… 人生做出的选择越多

Python程序员之间的友谊小船到底会不会翻呢?

普通人之间的友谊是很珍贵的,更何况是程序员呢?程序员之间的友谊是特别珍贵的,请珍惜.毕竟不知道哪一天,友谊的小船说翻就翻了呢- 好好珍惜你的小伙伴吧!千万别让他(她)走丢了! 本文来自网络,如有侵权,请联系小编删除! 原文地址:https://www.cnblogs.com/jiajia101/p/10220645.html

一说“相亲”春节小船说翻就翻?古人怎么过春节?x1

(五)健全层级设置.各职称系列均设置初级.中级.高级职称,其中高级职称分为正高级和副高级,初级职称分为助理级和员级,可根据需要仅设置助理级.目前未设置正高级职称的职称系列均设置到正高级,以拓展专业技术人才职业发展空间. 新华社北京1月8日电 特稿:实现跨越共铸大同--展望2017年"一带一路"建设 中国人民政治协商会议永州市第五届委员会第一次会议,于2017年1月3日至8日在冷水滩举行.在中共永州市委的领导下,经过全体委员和与会同志的共同努力,圆满完成了大会的各项任务,是一次团结.民主