水题,不解释。

#include<stdio.h>
#include<math.h>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 1000002
struct node
{
int x,y;
int dis;
}base[10005],st,end;
int n,m;
int maps[1005][1005];
bool vis[1005][1005];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
struct que
{
struct node t[N];
int head,tail;
void init()
{
head = tail = 0;
}
bool empty()
{
return head == tail;
}
struct node top()
{
return t[head];
}
void push(struct node a)
{
t[tail] = a;
tail ++;
if(tail >= N)
tail -= N;
}
void pop()
{
head ++;
if(head >= N)
head -= N;
}
}q;
int maxn;
int leng;
bool isok(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
void debug_map()
{
for(int i=0;i<n;i++,puts(""))
for(int j=0;j<m;j++)
printf("%3d",maps[i][j]);
}
void bfs()
{
node tt,tmp;
while(!q.empty())
{
tmp=q.top();
for(int d=0;d<4;d++)
{
tt.x=tmp.x+dx[d];
tt.y=tmp.y+dy[d];
tt.dis=tmp.dis+1;
if(isok(tt.x,tt.y)&&maps[tt.x][tt.y]==-1)
{
maps[tt.x][tt.y]=tt.dis;
maxn=max(maxn,tt.dis);
q.push(tt);
}
}
q.pop();
}
}
bool cal(int lim)
{
if(maps[st.x][st.y]<lim) return false;
q.init();
q.push(st);
node tmp,tt;
for(int i=0;i<=n;i++)
memset(vis[i],false,sizeof(bool)*(m+1)); while(!q.empty())
{
tmp=q.top();
for(int d=0;d<4;d++)
{
tt.x=tmp.x+dx[d];
tt.y=tmp.y+dy[d];
tt.dis=tmp.dis+1;
if(isok(tt.x,tt.y)&&maps[tt.x][tt.y]>=lim&&!vis[tt.x][tt.y])
{
vis[tt.x][tt.y]=true;
if(tt.x==end.x&&tt.y==end.y)
{
leng=tt.dis;
return true;
}
q.push(tt);
}
}
q.pop();
}
return false;
}
int main()
{
int cas;
scanf("%d",&cas);
st.dis=0;
int tt;
while(cas--)
{
q.init();
maxn=0;
scanf("%d%d%d",&tt,&n,&m);
scanf("%d%d%d%d",&st.x,&st.y,&end.x,&end.y); for(int i=0;i<n;i++)
memset(maps[i],-1,sizeof(int)*(m+1));
node t;t.dis=0;
for(int i=0;i<tt;i++)
{
scanf("%d%d",&base[i].x,&base[i].y);
maps[base[i].x][base[i].y]=0; t.x=base[i].x;
t.y=base[i].y; q.push(t);
}
bfs();
int l=0,r=n+m;
int mid;
int ans=0;
while(l<=r)
{
mid=(l+r)/2;
if(cal(mid)) {ans=mid;l=mid+1;}
else r=mid-1;
}
printf("%d %d\n",ans,leng);
}
return 0;
}
/*
3 3 3
0 0 2
1 0
1 1
1 2
*/

poj 3501 Escape from Enemy Territory 二分+bfs的更多相关文章

  1. poj 3501 Escape from Enemy Territory 预处理+二分+bfs

    传送门 给一个起点一个终点, 给出整个地图的宽和高, 给出n个敌人的坐标. 让你找到一条路径, 这条路径上的点距离所有敌人的距离都最短, 输出最短距离. 首先预处理出来地图上的所有点到敌人的最短距离, ...

  2. hdu 2337 Escape from Enemy Territory

    题目大意 给你一张nn*mm矩形地图.上面有些点上有敌营.给你起点和终点, 你找出一条最优路径.满足最优路径上的点离敌营的最近最短距离是所有路径最短的.若有多条找路径最短的一条. 分析 通过二分来确定 ...

  3. POJ 1475 Pushing Boxes 搜索- 两重BFS

    题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...

  4. poj 3111 K Best 最大化平均值 二分思想

    poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...

  5. hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)

    题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...

  6. hdu-5652 India and China Origins(二分+bfs判断连通)

    题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K ...

  7. POJ 2110 Mountain Walking 二分+bfs

    传送门 昨天看到这个题还以为是个脑残的dp, 然而脑残的是我. 题目意思就是从左上角走到右下角, 设x为路径上的最大值-最小值, 求x的最小值. 二分x, 对于每一个x, 枚举下界lower, low ...

  8. POJ 2289 Jamie's Contact Groups (二分+最大流)

    题目大意: 有n个人,可以分成m个组,现在给出你每个人可以去的组的编号,求分成的m组中人数最多的组最少可以有多少人. 算法讨论: 首先喷一下这题的输入,太恶心了. 然后说算法:最多的最少,二分的字眼. ...

  9. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

随机推荐

  1. ASP.NET MVC 学习7、为Model Class的字段添加验证属性(validation attribuate)

    Adding Validation to the Model ,在Model中添加数据验证 参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-star ...

  2. Fatal NI connect error 12170

    Fatal NI connect error 12170 转载:http://www.xifenfei.com/1812.html 今天在一台服务器的日志文件中,发现如下信息: Fatal NI co ...

  3. UVA 575 Skew Binary (水)

    题意:根据这种进制的算法,例如,给你一个左式,要求推出右式.(其实右式就是一个十进制数,根据这种进位的方法来转成特殊进制的数.) 思路:观察转换特点,有点类似于二进制,但是其在后面还减一了.比如25- ...

  4. <九>面向对象分析之UML核心元素之设计类,类,属性,方法,可见性

    设计类

  5. mysql中出现的Data truncated for column

    mysql中想一个数据库中插入一条记录时,有可能因为好多原因,会出现Data truncated for column XXXXX的错误,这是因为你的数据类型的长度不一致导致的,仔细查看一下数据类型的 ...

  6. 使用carrierwave出现MiniMagick::Invalid错误的解决方法

    安装Imagemagick不能从源码安装,要从软件市场安装,否则会出现错误:MiniMagick::Invalid 使用make uninstall卸载后,重新在软件市场里安装,问题解决.

  7. storm入门教程 第四章 消息的可靠处理【转】

    4.1 简介 storm可以确保spout发送出来的每个消息都会被完整的处理.本章将会描述storm体系是如何达到这个目标的,并将会详述开发者应该如何使用storm的这些机制来实现数据的可靠处理. 4 ...

  8. CodeForces 558E(计数排序+线段树优化)

    题意:一个长度为n的字符串(只包含26个小字母)有q次操作 对于每次操作 给一个区间 和k k为1把该区间的字符不降序排序 k为0把该区间的字符不升序排序 求q次操作后所得字符串 思路: 该题数据规模 ...

  9. hdu5073 简单枚举+精度处理

    其实这题还是挺简单的,因为移动k个星球后,这k个星球的权值就可以变为0,所以只有剩下的本来就是连着的才是最优解,也就是说要动也是动两端的,那么就O(N)枚举一遍动哪些就好了. 我是在杭电oj题目重现的 ...

  10. Bug疑难杂症 - java.lang.NoSuchFieldError: udhLen

    通过友盟后台记录到一个诡异的错误: HUAWEI C8825D 4.0.4 百度.谷歌都未能找到一丝结果更别提解决方案. java.lang.NoSuchFieldError: udhLen at a ...