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=;
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 小船弯弯的更多相关文章
- CentOS 7主机名的弯弯绕绕
在CentOS 6中,修改主机名方式很简单,临时修改主机名使用hostname命令,永久修改主机名直接写进文件/etc/sysconfig/network中即可. 但在CentOS 7中,主机名就没那 ...
- 海盗船长小米首页小船来回摆动CSS3.0效果
海盗船长小米首页小船来回摆动CSS3.0效果,偶然之间看到的,就写了一个. <!DOCTYPE html> <html lang="en"> <hea ...
- 坐上JDK8时间SDK的小船,带你遨游UNIX时间戳与时区的小太空~
原文链接:坐上JDK8时间SDK的小船,带你遨游UNIX时间戳与时区的小太空- 一.背景: 最近有一个关于店铺数据实时分析的需求,需要实时统计店铺当天的数据:例如访客数,浏览量.商品排行榜等.由于店铺 ...
- 7个连环问揭开java多线程背后的弯弯绕
摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...
- 关于Unity中的小案例之运动的小船以及摄像机跟随技术(专题五)
实例步骤 1.创建Unity项目和文件目录,保存场景 场景搭建 2.导入美术做好的资源包(第68) a: 导入地形资源包terrain.unitypackage,把里面的Map/Prefabs/Ter ...
- “fixed+relative==absolute”——对BFC的再次思考
好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...
- Android中的自定义控件(二)
案例四: 自定义开关 功能介绍:本案例实现的功能是创建一个自定义的开关,可以自行决定开关的背景.当滑动开关时,开关的滑块可跟随手指移动.当手指松开后,滑块根据开关的状态,滑到最右边或者滑到 ...
- ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- Atitit 教育与培训学校 的计划策划 v4 qc18
Atitit 教育与培训学校 的计划策划 v4 qc18 1.1. 版本历史12. 教育历史的前世今生12.1. 自学vs 家庭学校vs 私立学校vs 公立学校模式 vs 企业内部学校 vs 其他商业 ...
随机推荐
- kali 2.0 U盘安装错误Your installation cd-rom couldn't be mounted
1.kali 2.0前天(2015.08.11)发布了.果断下载下来换掉本机的1.0版本. 2.用U盘安装的过程中,出现cd-rom无法挂载.提示错误Your installation CD-ROM ...
- 如何安装虚拟机VMware
虚拟机可以帮我们在一台电脑上面来模拟出多台电脑,而且可以装不同的系统.下面就教大家怎么装VMware虚拟机 1.下载Vmware安装包,建议下载VMware10 这个有中文版的,其他版本的都是英文的哦 ...
- 一张图看懂ANSYS17.0 流体 新功能与改进
一张图看懂ANSYS17.0 流体 新功能与改进 提交 我的留言 加载中 已留言 一张图看懂ANSYS17.0 流体 新功能与改进 原创2016-02-03ANSYS模拟在线模拟在线 模拟在线 ...
- EF6 如何判断DataContext有修改,以及如何放弃修改
如何判断DataContext有修改: EF6的 using (var db = new Model1()) { if (db.ChangeTracker.HasChanges()) { Cons ...
- Java Generics and Collections-2.2
2.2 Wildcards with extends 前面介绍过List<Integer>不是List<Number>的子类,即前者不能替换后者, java使用? extend ...
- 第5章 Java数组
1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...
- Struts2 JQuery UI常用插件
一.什么是插件 ①是遵循一定接口规范编写的程序 ②是原有系统平台功能的扩展和补充 ③只能运行在规定的系统平台下,而不能单独运行 注:由于jQuery插件是基于jQuery脚本库的扩展,所以所有jQue ...
- 如何动态在文档中加入<script></script>写入大段js?
<script language="javascript">var script = document.createElement("script" ...
- AVA数据库连接池.
package db_pool; //// 一个效果非常不错的JAVA数据库连接池.// from:http://www.jxer.com/home/?uid-195-action-viewspace ...
- 记一次排错,windows日志 模块 DLL C:\Windows\system32\inetsrv\aspnetcore.dll 未能加载。返回的数据为错误信息。
这个错误是在我本地开发环境,不是生产环境,如果是生产环境我就挂了....开发环境也痛苦啊,重装系统的话,我估计装系统+所有软件,少说也得1天..... 错误产生:重装IIS (尼玛,IIS总有一个小毛 ...