D - 小晴天老师系列——晴天的后花园
D - 小晴天老师系列——晴天的后花园
Problem Description
小晴天非常漂亮的后花园,打算以后退休之后在里面种种花,养养草,所以现在小晴天打算为他的后花园围上栅栏。
小晴天的后花园可以看成是一个m*n的矩形,但是其中有一些地方种了树,这些地方都不能安装栅栏,现在小晴天把后花园的平面图告诉你了,请你帮忙设计一个最大的矩形栅栏。
Input
单组数据,第一行包括两个整数m,n(1<=m,n<=500),接下来m行,每行包括n个字符,仅由'x'和'.'组成(ASCII码分别是120与46).
其中‘x’表示这个方格有树木,‘.’表示这个点可以建造栅栏
Output
若可以围成一个闭合栅栏,输出一个整数,表示栅栏能打到的最大周长
否则输出impossible
Sample Input
4 5
.....
.x.x.
.....
.....
2 2
.x
x.
2 5
.....
xxxx.
Sample Output
14
impossible
impossible
Hint
样例一可以绕着整个图一圈,周长为2*(4+3)=14
样例二与三因为有树木的存在,不能建造一个闭合的栅栏。
本题为单文件读写,样例包括三个文件
题意:
输入m,n,表示有一个大小为m*n的地图,然后输入那地图,'.'表示空地,可以建栏杆,'x'表示树木,不能够在建栏杆,问你该地图所能够围成的最大矩形栏杆需要多少个栏杆,(所围成的矩形不包括树木,只能由栏杆组成),在做这一题主要是寻找最大的矩形,没有规律怎么办,那就暴搜吧,从每一个点作为起始点(矩形的左上端点),不过搜也要搜得有水平。
首先,找出该起始点(x,y)的右边最大能够到达的点,最大长度设为i,然后再从(x,y+i)向下找,所能够到达的点,最大长度设为j,然后再从(x+j,y+i)~(x+j,y)去判断是否都为'.'空地,如果是的话,再从(x+j,y)~(x,y)去判断是否为'.'空地,如果是的话说明能够构成一个矩形。
记录该矩形的最大长度i和j,栏杆的最大数目sum=max((i+j)*2,sum);
最后在判断sum是否为0,为0输出 impossible,否则输出sum;
(PS:在每次获取i和j的时候可以判断(i+m-1)*2或者(i+j)*2是否大于sum,如果比sum还小的话,就没有必要再进行接下去的判断。)
#include <iostream>
#include <stdio.h>
#include <string.h>
#define Max(a,b)a>b?a:b
using namespace std;
char Map[][];
int Len_X,Len_Y; /*地图的最大长度和最大宽度*/
int sum; /*记录栏杆的最大数量*/
int Ret_Y(int x,int y)/*获取(x,y)的右边的最大长度*/
{
int j;
for(j=;j+y<=Len_Y;j++)
{if(Map[x][j+y]=='x')break;}
return j-;
} int Ret_X(int x,int y)/*获取(x,y)的向下的最大长度*/
{
int j;
for(j=;j+x<=Len_X;j++)
{if(Map[x+j][y]=='x')break;}
return j-;
} void Work(int x,int y)
{
int i,j,k,l,ii,jj,kk,ll,sign1,sign2;
// printf("%d %d:\n",x,y);
for(i=Ret_Y(x,y);i>=;i--) /*获取(x,y)最大右边距离,然后长度递减查找*/
{
if(Map[x][y+i]=='.'&&(i+Len_X-)*>sum)/*判断为空地和剪枝*/
{
for(j=Ret_X(x,y+i);j>=;j--) /*获取(x,y+i)最大向下距离,然后长度递减查找*/
{
if(Map[x+j][y+i]=='.'&&(i+j)*>=sum)/*判断为空地和剪枝*/
{
for(k=,sign1=;k<=i;k++) /*判断矩形下边是否都为空地*/
{
if(Map[j+x][y+i-k]=='.')sign1++;
else break;
}
if(sign1==i)/*矩形下边符合条件*/
{
for(k=,sign2=;k<j;k++) /*判断矩形左边是否都为空地*/
{
if(Map[j+x-k][y]=='.')sign2++;
else break;
}
if(sign2==j-)/*符合构成矩形条件*/
{
//printf("\t%d %d\n",i,j);
sum=Max(sum,(i+j)*);/*获取最大值,其实每一次获取的都是最大值*/
// return;
}
}
}
}
}
else break;
}
return ;
} int main()
{
int i,j;
while(scanf("%d%d",&Len_X,&Len_Y)!=EOF)
{
memset(Map,'x',sizeof(Map));/*设置围墙*/
for(i=;i<=Len_X;i++)
{
scanf(" %s",Map[i]+);
Map[i][Len_Y+]='x';/*设置围墙*/
}
for(i=,sum=;i<=Len_X;i++)
{
for(j=;j<=Len_Y;j++)
{
if(Map[i][j]=='.')
{
Work(i,j); /*搜索每一个点*/
}
}
}
if(sum)printf("%d\n",sum);
else printf("impossible\n");
}
return ;
}
/*
4 4
....
....
..x.
.x.x */
D - 小晴天老师系列——晴天的后花园的更多相关文章
- acdream 小晴天老师系列——晴天的后花园 (暴力+剪枝)
小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- acdream 小晴天老师系列——苹果大丰收(DP)
小晴天老师系列——苹果大丰收 Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买 ...
- F - 小晴天老师系列——苹果大丰收
F - 小晴天老师系列——苹果大丰收 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...
- acdream 小晴天老师系列——竖式乘法(简单穷举)
小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- G - 小晴天老师系列——可恶的墨水瓶
G - 小晴天老师系列——可恶的墨水瓶 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
- E - 小晴天老师系列——我有一个数列!
E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/O ...
- C -小晴天老师系列——竖式乘法
C - 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...
- acdream 小晴天老师系列——我有一个数列! (ST算法)
小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)S ...
- [ACdream]小晴天老师系列——竖式乘
题目链接:http://acdream.info/contest?cid=1269#problem-C Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学 ...
随机推荐
- HelloMyBLOG!!!
还记得刚辞职的时候,心中满是无助.学习Java的期间让我慢慢重拾信心,带我走出最初的迷茫.如今我已不再是一个人,今后渐渐要开始挑起一个家庭甚至几个家庭的重担.现在也算是在异乡暂时站住了脚跟,虽然离我的 ...
- kali客户端攻击
浏览器攻击 browser_autpwn2 (BAP2) mkdir /test 为接受响应的服务器创建目录 use auxiliary/server/browser_autopwn2 set ...
- Qt 外观之一 ——Qt Style Sheet
Qt Style Sheet 目录 使用 对于应用程序 创建自定义控件 QSS语法 一般选择器(selector) 伪选择器 解决冲突 使用specificity Namespace冲突 级联效应 设 ...
- 搭建git代码服务器
在代码管理中,通常需要使用版本管理工具,git就是一个不错的选择,这里简单罗列一下git服务器的搭建过程. 1. 安装git工具包 2. 初始化git库:在代码服务器上,通常只需要创建一个不含有工作目 ...
- 向多个会话窗口发送命令 -SecureCRT
1.前提 一个服务可能部署在多台机器上,这时如果要查问题,最繁复的方法就是打开该服务的每个session,把命令在每一台机器上复制一下执行,找到相关的日志:还有一种方法就是一条命令同时向多个会话窗口发 ...
- Quartz+log4net实现控制台程序定时运行,并且记录日志
c# 控制台程序定时运行,并记录日志. 组件Quartz + log4net Quartz定时运行程序,log4net记录日志. 首先建立控制台程序"QuartzTest" 安装Q ...
- nodejs问题整理--fs.exists无法正确判断文件的问题
fs.exists方法 方法说明: 测试某个路径下的文件是否存在.回调函数包含一个参数exists,true则文件存在,否则是false. 语法: fs.exists(path, callback) ...
- Eclipse主题设置
1. 内部编辑区域主题 Eclipse黑色主题包 下载主题包解压到Eclipse安装目录下的dropins目录,重启Eclipse,Windows—>Preferences—>Genera ...
- NSCondition用法
NSCondition用法 使用NSCondition,实现多线程同步...举个列子 消费者跟生产者... 现在传言6s要出了.. 消费者想买6s.现在还没有6s.消费者等待6s生产. 生产了一个产品 ...
- QTP脚本汇总比较有价值
1.Object Spy的Tips Hold the CTRL key to change the window focus or perform other mouse operations 2. ...