HDU 4543
这道题感觉很坑。。不过,注意一些小问题。
参考http://www.cnblogs.com/Lattexiaoyu/archive/2013/03/31/2992553.html改进了原来自己的复杂度。
当无被占领时,其实枚举边缘也可以。但有计算公式,直接用了。
当有占领时,BFS出每个空的格到被占领的最小距离,然后枚举求出最小的D。
1)起先自己也是如上面的做,但做法不够优美T了。BFS时,起初是把占领的和未占的分开存枚举计算。其实这样复杂度就很高了。直接按一般的BFS就可以了,因为先到达空格的必定是距离短的,所以,复杂度变成了o(NM)。
2)枚举求D也有小技巧。直接三重循环必须T。可以改为枚举D,三重循环判断D是否符合要求,符合则D++,不符合即能得到答案了。
为什么不符合就能得到答案?因为排序后的点当枚举到q时,剩下的三重循环会把所有情况都列举到,所以不符合D-1就是解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m; struct Node{
int x,y,dis;
Node(){}
Node(int xx,int yy,int d){x=xx,y=yy,dis=d;}
}que[10300],dic[5300];
int cd,head,tail;
char s[100];
int dir[4][2]={
{0,1},
{0,-1},
{1,0},
{-1,0}
}; int cal(int i,int j,int x,int y){
return abs(i-x)+abs(j-y);
} int map[80][80]; int uslove(){/*
int ans=1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
for(int k=0;k<m;k++){
int t=min(cal(0,i,j,m-1),cal(j,m-1,n-1,k));
ans=max(ans,min(cal(0,i,n-1,k),t));
}
for(int k=0;k<n;k++){
int t=min(cal(0,i,j,m-1),cal(j,m-1,k,0));
ans=max(ans,min(cal(0,i,k,0),t));
}
}
}
// printf("%d\n",ans);*/
// return ans;
if(n == 1) return m / 3;
if(m == 1) return n / 3;
return (2*n + 2*m - 4)/3;
} bool cmp(Node a,Node b){
if(a.dis<b.dis) return true;
return false;
} bool check(int x,int y){
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]==0) return true;
return false;
} void BFS(){
/* for(int i=0;i<cd;i++){
dic[i].dis=200;
for(int j=0;j<co;j++){
dic[i].dis=min(dic[i].dis,cal(dic[i].x,dic[i].y,occ[j].x,occ[j].y));
// cout<<dis[i]<<endl;
}
}*/
Node p,tmp;
while(head<tail){
p=que[head++];
for(int i=0;i<4;i++){
tmp.x=p.x+dir[i][0];
tmp.y=p.y+dir[i][1];
if(check(tmp.x,tmp.y)){
tmp.dis=p.dis+1;
map[tmp.x][tmp.y]=tmp.dis;
dic[cd++]=Node(tmp.x,tmp.y,p.dis);
que[tail++]=tmp;
}
}
}
} void slove(){
/*
int ans=-1;
int t;
for(int i=0;i<cd;i++){
if(dis[i]<ans) continue;
for(int j=i+1;j<cd;j++){
t=min(dis[j],dis[i]);
if(t<ans) continue;
for(int k=j+1;k<cd;k++){
int t1=min(dis[k],t);
if(t1<ans) continue;
t1=min(t1,cal(dic[i].x,dic[i].y,dic[j].x,dic[j].y));
t1=min(t1,cal(dic[i].x,dic[i].y,dic[k].x,dic[k].y));
t1=min(t1,cal(dic[j].x,dic[j].y,dic[k].x,dic[k].y));
ans=max(t1,ans);
}
}
}
printf("%d\n",ans);*/
sort(dic,dic+cd,cmp);
int q=0,d=1;
while(q<cd){
bool flag=false;
for(int i=q;i<cd;i++){
for(int j=i+1;j<cd;j++){
if(cal(dic[i].x,dic[i].y,dic[j].x,dic[j].y)<d) continue;
for(int k=j+1;k<cd;k++){
if(cal(dic[i].x,dic[i].y,dic[k].x,dic[k].y)>=d&&cal(dic[k].x,dic[k].y,dic[j].x,dic[j].y)>=d){
flag=true;
break;
}
}
if(flag) break;
}
if(flag) break;
}
if(!flag) break;
d++;
while(q<cd&&dic[q].dis<d)
q++;
}
printf("%d\n",d-1);
} int main(){
int T,icase=0;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
cd=0; int cc=0;
head=tail=0;
memset(map,0,sizeof(map));
for(int i=0;i<n;i++){
scanf("%s",s);
for(int j=0;j<m;j++){
if(s[j]=='F'){
map[i][j]=1;
que[tail++]=Node(i,j,1);
}
else cc++;
}
}
printf("Case %d: ",++icase);
if(cd==n*m){
printf("%d\n",uslove());
}
else{
BFS();
slove();
}
}
return 0;
}
HDU 4543的更多相关文章
- hdu 2594 Simpsons’ Hidden Talents(KMP入门)
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
随机推荐
- 解决Sublime Text 3 的 Package Control 启动失败问题
今天在使用Sublime Text的时候,需要了这样的情况 遇到这个问题的时候 我是这样解决的 一. 首先 找到 Package Control的下载地址1 下载地址2.将下载下 ...
- python自动化测试学习笔记-1
一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行测试用例进行测试: 二.python ...
- SQL数据库还原的二种方式和区别
1.数据库还原 在SQL中,直接选择选择“还原数据库”:选中.bak 文件即可. 2.生成脚本 新建同样的DB名字,在SQL打开脚本,执行脚本语言.数据库里面就会自动填充内容.
- Codeforces 766E
题意:给一棵树(1e5),每个节点上有对应权值(0<=ai<=1e6)定义树上两个节点间的距离为路径中节点的异或,求所有节点对间的距离和(包括节点自身也作为节点对,距离为节点权值). 解题 ...
- 注解配置AOP切面编程
1.导入先关jar包 2.编写applicationContext.xml,配置开启注解扫描和切面注解扫描 <?xml version="1.0" encoding=&quo ...
- 【LeetCode】 -- 68.Text Justification
题目大意:给定一个数组容器,里面存有很多string: 一个int maxWith.让你均匀安排每一行的字符串,能够尽可能的均匀. 解题思路:字符串+贪心.一开始想复杂了,总觉的题意描述的不是很清楚, ...
- MVC系列学习(五)-传递数据 与 接收数据
1.控制器向视图传递数据 a.使用ViewData b.使用ViewBag c.使用Model 方式二: d.使用TempData 2.为什么在控制器中设置了一些属性,在视图中可以接受 3.Actio ...
- 如何下载 Nginx (windows 版本)并且简单的使用
官网地址:http://nginx.org/ 进到官网 我这里下载的是 稳定版的 windows版本. 开始我们的简单测试 步骤一:找到nginx的压缩包,(随意找个地方)解压 步骤二:进入conf文 ...
- linux使用mount命令挂载、umount命令取消挂载
一.mount挂载目录方式: mount 挂载目录 磁盘目录 二.umout取消挂载目录方式: 1.umout 磁盘目录 2.umout 挂载目录 3.umout 磁盘目录 挂载目录 如下图
- [Windows Server 2008] 安装网站伪静态
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装IIS伪静 ...