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 其他商业 ...
随机推荐
- 关于JS的编码转换问题
在进行JS开发过程中,尤其是在开发报表时,报表已集成到Web页面中,通过在页面传递参数至报表中时,会发现有时某些参数值,传递到报表中是显示为问号或乱码等等一系列不能正常显示的情况. 这是由于浏览器和报 ...
- 【原】使用VirtIE6代替IE6
做前端开发难免要使用IE6,相信很多朋友知道win7上是不支持安装IE6的,通常会使用IETester,要么在win7中安装虚拟机,在虚拟机中安装IE6. 分析下这2种方式: IETester:并不是 ...
- COGS130. [USACO Mar08] 游荡的奶牛[DP]
130. [USACO Mar08] 游荡的奶牛 ★☆ 输入文件:ctravel.in 输出文件:ctravel.out 简单对比时间限制:1 s 内存限制:128 MB 奶牛们在被划 ...
- Spring MVC 使用HiddenHttpMethodFilter配置Rest风格的URL
/** Rest 风格的 URL. 以 CRUD 为例: 新增: /order POST 修改: /order/1 PUT update?id=1 获取:/order/1 GET get?id=1 删 ...
- Leetcode:378. Kth Smallest Element in a Sorted Matrix
题目: Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the ...
- 查看struct或class的内存布局
适用于VC编译器(Visual Studio) 附加选项: /d1 reportSingleClassLayout[foo] 例如CItem(注意后面没有空格) /d1 reportSingleCla ...
- .net线程池
线程池的作用线程池,顾名思义,线程对象池.Task和TPL都有用到线程池,所以了解线程池的内幕有助于你写出更好的程序.由于篇幅有限,在这里我只讲解以下核心概念: 线程池的大小 如何调用线程池添加任务 ...
- 招聘前端、Java后端开发、测试、Mysql DBA
公司介绍: http://www.lagou.com/gongsi/43095.html http://www.yamichu.com 简历发到: zhuye@yamichu.com 招聘职位: JA ...
- 线段树 poj 2991
我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...
- sp_executeSql 用法
今天遇到了一个难题 就是把 一个拼接sql语句 的返回值 赋值给一个变量 经研究 要用sp_executeSql这个存储过程 据说是从sql 2005才开始有的 代码如下: declare @str ...