WHYZOJ-#95 大逃亡(二分+BFS)(好题!!!)

【题目描述】:

给出数字N,X,Y,代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从0到Y-1再给出四个数字x1,y1,x2,y2,代表你要从点(x1,y1)移到(x2,y2)。在移动的过程中你当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少,以及在这个前提下,你最少要走多少步才可以回到目标点。注意这里距离的定义为两点的曼哈顿距离,即某两个点的坐标分为(a,b),(c,d),那么它们的距离为|a-c|+|b-d|。

【输入描述】:

第一行给出数字N,X,Y

第二行给出x1,y1,x2,y2

下面将有N行,给出N个敌人所在的坐标

【输出描述】:

在一行内输出你离敌人的距离及在这个距离的限制下,你回到目标点最少要移动多少步。

【样例输入】:

2 5 6
0 0 4 0
2 1
2 3

【样例输出】:

2 14

【时间限制、数据范围及描述】:

时间:1s 空间:256M

1<=N<=10000, 1<=X<=1000, 1<=Y<=1000

实在是好题!!好久没有做过这么有质量的题了!!用苹果叶的话来说就是,这题又不难,你想把它做对有不润噫。首先第一个BFS预处理当时搞忘掉了QAQ,还有就是二分的时候有一些特殊情况要注意!夜深了,睡觉!

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int MAX=1005;
 5 int t,n,m;
 6 int xx,yy,x2,y2;
 7 int a[MAX][MAX];
 8 int dx[4]={-1,0,1,0};
 9 int dy[4]={0,1,0,-1};
10 struct Poi{
11     int x,y;
12 };
13 queue <Poi> q;
14 inline int read(){
15     int an=0,x=1;char c=getchar();
16     while (c<‘0‘ || c>‘9‘) {if (c==‘-‘) x=-1;c=getchar();}
17     while (c>=‘0‘ && c<=‘9‘) {an=an*10+c-‘0‘;c=getchar();}
18     return an*x;
19 }
20 void init(){
21     int i,j;
22     Poi zt;
23     t=read(),n=read(),m=read();
24     xx=read(),yy=read(),x2=read(),y2=read();
25     xx++,yy++,x2++,y2++;
26     for (i=1;i<=n;i++)
27         for (j=1;j<=m;j++)
28             a[i][j]=100000000;
29     for (i=1;i<=t;i++){
30         zt.x=read();zt.y=read();
31         zt.x++,zt.y++;
32         a[zt.x][zt.y]=0;
33         q.push(zt);
34     }
35     while (q.size()){
36         Poi u=q.front(),v; q.pop();
37         for (i=0;i<4;i++){
38             v.x=u.x+dx[i];v.y=u.y+dy[i];
39             if (v.x<1 || v.x>n || v.y<1 || v.y>m) continue;
40             if (a[v.x][v.y]!=100000000) continue;
41             a[v.x][v.y]=a[u.x][u.y]+1;
42             q.push(v);
43         }
44     }
45 }
46 int vis[MAX][MAX];
47 bool feasible(int x){
48     int i,j;
49     memset(vis,0,sizeof(vis));
50     Poi zt,u,v;
51     zt.x=xx,zt.y=yy;
52     if (a[xx][yy]<x) return false;
53     while (q.size()) q.pop();
54     q.push(zt);
55     while (q.size()){
56         u=q.front();q.pop();
57         for (i=0;i<4;i++){
58             v.x=u.x+dx[i];v.y=u.y+dy[i];
59             if (v.x<1 || v.x>n || v.y<1 || v.y>m) continue;
60             if (a[v.x][v.y]<x || vis[v.x][v.y]) continue;
61             vis[v.x][v.y]=vis[u.x][u.y]+1;
62             q.push(v);
63         }
64     }
65     return vis[x2][y2]>0;
66 }
67 int main(){
68     freopen ("escape.in","r",stdin);
69     freopen ("escape.out","w",stdout);
70     int i,j,ans;
71     init();
72     int low=1,mid,high=n*m;
73     while (low<=high){
74         mid=(low+high)>>1;
75         if (feasible(mid)){
76             low=mid+1;
77             ans=vis[x2][y2];
78         }
79         else
80             high=mid-1;
81     }
82     if (low-1==0){
83         feasible(0);
84         printf("0 %d",vis[x2][y2]);
85     }
86     else
87         printf("%d %d",low-1,ans);
88     return 0;
89 }
时间: 2024-08-09 22:00:15

WHYZOJ-#95 大逃亡(二分+BFS)(好题!!!)的相关文章

HDU1253--胜利大逃亡--简单BFS

转自http://www.cnblogs.com/yuyixingkong/p/3245297.html 代码是我的.. 胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21759    Accepted Submission(s): 8538 Problem Description Ignatius被魔王抓走了,有一天魔王

hdu 1253 胜利大逃亡(bfs)

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 29504    Accepted Submission(s): 11124 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的

hdu.1429.胜利大逃亡(续)(bfs + 0101011110)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6070    Accepted Submission(s): 2096 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

hdu--1429--胜利大逃亡(续) (bfs+状态压缩)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8560    Accepted Submission(s): 3071 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)-- 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

hdu 1429 胜利大逃亡(续)(bfs+位压缩)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7346    Accepted Submission(s): 2546 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

九度1456胜利大逃亡【BFS】

时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4432 解决:1616 题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Igna

胜利大逃亡,bfs,广度优先搜索

题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好

HDU1429 胜利大逃亡(续) BFS +简单状压

把手中持有的钥匙状态状压一下即可,然后vis访问标记的时候,开个三维,多一维即为当前持有钥匙状态,这样就能祛除重复标记困难走点的问题,跟网络赛那题很像,网络赛的更难点,这个简单点 int n,m,t; int sx,sy,ex,ey; char mp[20 + 55][20 + 55]; bool vis[20 + 5][20 + 5][(1<<10) + 5]; int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; struct Node { int no

HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑一般的搜索问题的解答思路: 搜索算法即在解空间中搜索满足要求的答案,可以看做一棵不断生长的状态树,状态之间不断扩展出新的状态,直到找出所需要的状态,即答案: <1>定义状态:对于该问题,由于存在门与锁的约束条件,所以状态应该包括3个元素,即人所在的坐标 x 和 y 以及含有锁的种类: <2&