D - 小晴天老师系列——晴天的后花园

Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)
Submit Status

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 - 小晴天老师系列——晴天的后花园的更多相关文章

  1. acdream 小晴天老师系列——晴天的后花园 (暴力+剪枝)

    小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  2. acdream 小晴天老师系列——苹果大丰收(DP)

    小晴天老师系列——苹果大丰收 Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买 ...

  3. F - 小晴天老师系列——苹果大丰收

    F - 小晴天老师系列——苹果大丰收 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Other ...

  4. acdream 小晴天老师系列——竖式乘法(简单穷举)

    小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)   ...

  5. G - 小晴天老师系列——可恶的墨水瓶

    G - 小晴天老师系列——可恶的墨水瓶 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Othe ...

  6. E - 小晴天老师系列——我有一个数列!

    E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/O ...

  7. C -小晴天老师系列——竖式乘法

    C - 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others ...

  8. acdream 小晴天老师系列——我有一个数列! (ST算法)

    小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)S ...

  9. [ACdream]小晴天老师系列——竖式乘

    题目链接:http://acdream.info/contest?cid=1269#problem-C Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学 ...

随机推荐

  1. python向服务器发送邮件事例

    import osimport sysimport re __author__ = 'xiaoming' import requestststr = '<div>\n<ul>\ ...

  2. android相关内容

    一: 前台进程: 前台的进程的优先级最高, 可见进程: android系统一般存在少量的可见进程. 服务进程: 没有用户界面, 后台进程: 一般存在较多的后台进程. 空进程: 不包括任何活跃组件的进程 ...

  3. 【POJ2186】受牛仰慕的牛

    受牛仰慕的牛(popular cows)  每头牛都有一个梦想:成为一个群体中最受欢迎的名牛!在一个有N(1<=N<=10,000)头牛的牛群中,给你M(1<=M<=50,00 ...

  4. Error pulling origin: error: Your local changes to the following files would be overwritten by merge

    Git在pull时,出现这种错误的时候,可能很多人进进行stash,相关stash的请看:Error pulling origin: error: Your local changes to the ...

  5. 《HTML5与CSS3权威指南》读书笔记(上册)—HTML5篇

    豆瓣上的评分少且评价不太好,阅读当中发现几处刊物上的小问题,不过线下口碑貌似不错,基本上人手一本 上册五百多页,主讲H5,分为标签,本地存储,离线应用程序,新的API,获取地理位置信息标签包含表单,C ...

  6. THML结构语义化之table/form

    以table/form标签语义化,做为博客首贴 应用场景1-table表格 <table> <caption> <thead> <th colspan=&qu ...

  7. uiscrollview 事件冲突

    self.scrollView.panGestureRecognizer.delaysTouchesBegan = YES;设置scrollView的延迟接收点击触摸事件,关闭触摸事件 self.sc ...

  8. [帖子收集]通用Windows平台(UWP)

    通用Windows平台,universal windows platform,UWP 什么是通用 Windows 平台 (UWP) 应用?(微软MSDN) 如何在通用 Windows 平台应用中使用现 ...

  9. Chloe and pleasant prizes

    Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  10. SQL MySQL

    SQL 结构化查询语言(英语:Structural Query Language,缩写:SQL),是一种特殊目的之编程语言,用于数据库中的标准数据查询语言. 各种通行的数据库系统在其实践过程中都对SQ ...