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 ...
随机推荐
- $P5017 摆渡车$
problem 毒瘤\(DP\) #ifdef Dubug #endif #include <bits/stdc++.h> using namespace std; typedef lon ...
- 【洛谷4158/BZOJ1296】[SCOI2009]粉刷匠(动态规划)
题目:洛谷4158 分析: 这题一看就是动态规划. 可以看出,如果每个木条粉刷的次数是固定的,那么这些木条是互不干扰的,因此对于每个木条可以通过dp来求出把T次中的j次分配给这个木条时可以获得的最大正 ...
- IIS设置HTTP To HTTPS
转自: http://www.cnblogs.com/yipu/p/3880518.html 1.购买SSL证书,参考:http://www.cnblogs.com/yipu/p/3722135.ht ...
- iOS动画——CoreAnimation
CoreAnimation在我之前的UIKit动画里面简单的提了一句CoreAnimation动画,其实大家别看它类库名种有个animation,实际上animation在这个库中只占有很小的地位. ...
- 在Django中使用redis:包括安装、配置、启动。
一.安装redis: 1.下载: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 2.解压 tar -zxvf redis-.tar ...
- Redux 基础概念
Redux is a predictable state container for JavaScript apps.,亦即 Redux 希望能提供一个可以预测的 state 管理容器,让开发者可以可 ...
- SQL基本操作——DROP撤销索引、表以及数据库
DROP撤销索引.表以及数据库 --DROP INDEX 命令删除表格中的索引 DROP INDEX table_name.index_name --DROP TABLE 语句删除表(表的结构.属性以 ...
- 搜索条件两个时间,通过php数组排序,保证select语句between时间 前小后大
//搜索条件两个时间,通过数组排序,保证select语句between时间 前小后大 $sort_array=[$_POST['clockDate1'],$_POST['clockDate2']]; ...
- 【转载】HTTP 响应头与状态码
原文地址:https://segmentfault.com/a/1190000006689786 HTTP Response Header 响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描 ...
- S3C2440时钟体系
注:以下内容学习于韦东山老师arm裸机第一期视频教程 一. 2440时钟简介 1.1 2440是一个SOC(system on chip)系统,不仅有很多CPU,还有很多外设,在2440芯片手册有系统 ...