poj 3501 Escape from Enemy Territory 二分+bfs
水题,不解释。
#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的更多相关文章
- poj 3501 Escape from Enemy Territory 预处理+二分+bfs
传送门 给一个起点一个终点, 给出整个地图的宽和高, 给出n个敌人的坐标. 让你找到一条路径, 这条路径上的点距离所有敌人的距离都最短, 输出最短距离. 首先预处理出来地图上的所有点到敌人的最短距离, ...
- hdu 2337 Escape from Enemy Territory
题目大意 给你一张nn*mm矩形地图.上面有些点上有敌营.给你起点和终点, 你找出一条最优路径.满足最优路径上的点离敌营的最近最短距离是所有路径最短的.若有多条找路径最短的一条. 分析 通过二分来确定 ...
- POJ 1475 Pushing Boxes 搜索- 两重BFS
题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...
- poj 3111 K Best 最大化平均值 二分思想
poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...
- hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)
题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...
- hdu-5652 India and China Origins(二分+bfs判断连通)
题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- POJ 2110 Mountain Walking 二分+bfs
传送门 昨天看到这个题还以为是个脑残的dp, 然而脑残的是我. 题目意思就是从左上角走到右下角, 设x为路径上的最大值-最小值, 求x的最小值. 二分x, 对于每一个x, 枚举下界lower, low ...
- POJ 2289 Jamie's Contact Groups (二分+最大流)
题目大意: 有n个人,可以分成m个组,现在给出你每个人可以去的组的编号,求分成的m组中人数最多的组最少可以有多少人. 算法讨论: 首先喷一下这题的输入,太恶心了. 然后说算法:最多的最少,二分的字眼. ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
随机推荐
- Raphael 目标点沿路径不断移动
<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8" ...
- error LNK2019: 无法解析的外部符号 __imp___CrtDbgReportW
error LNK2005 and error LNK2019 error LNK2019: unresolved external symbol __imp___CrtDbgReportW refe ...
- HDU 3844 Mining Your Own Business(割点,经典)
题意: 给出一个连通图,要求将某些点涂黑,使得无论哪个点(包括相关的边)撤掉后能够成功使得剩下的所有点能够到达任意一个涂黑的点,颜料不多,涂黑的点越少越好,并输出要涂几个点和有多少种涂法. 思路: 要 ...
- JS全局变量VAR和THIS
(注意)JS全局变量VAR和THIS 很多人都觉得在javascript声明一个变量,加var和不加var没有什么区别,实际上是一个错误的观点,如果在函数外面,也就是说在window区域加不加var确 ...
- jQuery的威力
jQuery如此之好用,和其在获取对象时使用与CSS选择器兼容的语法有很大关系,毕竟CSS选择器大家都很熟悉(关于CSS选择器可以看看十分钟搞定CSS选择器),但其强大在兼容了CSS3的选择器,甚至多 ...
- 查看buffer cache命中率
SQL> select name,value from v$sysstat where name in('db block gets','consistent gets','physical r ...
- MyBatis 物理分页
MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回 为了在数据库层面上实现物理分页,又不改变原来MyBatis的函 ...
- 【LeetCode 221】Maximal Square
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...
- ADO.NET 中的数据并发
当多个用户试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响.处理这种情况的系统叫做“并发控制”.并发控制的类型通常,管理数据库中的并发有三种常见的方 ...
- cxf 动态创建客户端,局域网能正常调用服务端,外网不能访问