二分迷宫

链接:https://ac.nowcoder.com/acm/contest/9165/E
来源:牛客网

牛郎织女生活在一个巨大的二维坐标系之中,他们的位置永远是一个二维坐标整数对(x,y),其中x,y均为整数(可能为负),在x轴上阻隔了坐标轴上半部分和下半部分的连通,即存在y=0的直线阻隔上下部分的连通。
而在x轴上,聪明的丘比特为牛郎和织女挖出了n个洞,洞的坐标为 (a1, 0),(a2, 0), ……, (aN, 0) ,其中a为整数。
牛郎每次移动只能移动到相邻的格子,设牛郎当前位置为(a,b),则他可以到达(a+1,b),(a-1,b),(a,b+1),(a,b-1) 这四个格子(但不能穿过直线,除非有洞)
即对于y = 0上的所有格子,只有 (a1, 0),(a2, 0), ……, (aN, 0) 可以通过,之外的所有纵坐标为0的网格均不能通过,而对于(x, y)有y不为0的网格可以认为是随意通过的。
下面有m个询问,询问牛郎的初始坐标为(x1,y1),织女的初始坐标为(x2,y2)时,牛郎需要移动多少次找到织女(坐标与织女重合)

输入描述:

输入的第1行为一个正整数N,为直线上洞的个数。

第2行有N个整数,a1, a2,…, aN,之间用空格隔开,为这N个洞的横坐标。

第3行为一个正整数M,表示了M个询问。

接下来M行,每行4个整数x1, y1, x2, y2,有y1与y2均不等于0,表示了一个询问从(x1, y1)到(x2, y2)的最短路。

输出描述:

输出共包含m行,第i行对于第i个询问输出从(x1, y1)到(x2, y2)的最短路距离是多少。

示例1

输入

复制
2
2 -1
2
0 1 0 -1
1 1 2 2

输出

复制
4
2

说明

n,m≤100000,ai,xi,yi绝对值不超过100000000。

这个题大意了,一直在想BFS,其实就是一个二分

#include<iostream>
#include<algorithm>
#include<map>
#include<queue> 
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
int a[maxn];
int main(){
    int n,t;
    cin>>n;
    a[1]=-1e9;
    for(int i=2;i<=n+1;i++){
        cin>>a[i];
    }
    a[n+2]=1e9;
    n+=2;
    sort(a+1,a+n+1);
    cin>>t; 
    while(t--){
        int x,y,xx,yy;
        scanf("%d%d%d%d",&x,&y,&xx,&yy);
        if(y>=0&&yy>=0){
            printf("%d
",abs(x-xx)+abs(y-yy));
        }
        else if(y<=0&&yy<=0){
            printf("%d
",abs(x-xx)+abs(y-yy));
        }
        else{
            if(x>xx) {
                swap(x,xx);
                swap(y,yy);
            }
            int u=lower_bound(a+1,a+n+1,x)-a;
            int ans=0,p=0;
            ans+=a[u]-x;
            if(xx>=a[u]){
                ans+=(xx-a[u]);
            } 
            else{
                ans+=(a[u]-xx);
            }
            p+=(x-a[u-1]);
            p+=(xx-a[u-1]); 
            printf("%d
",min(ans,p)+abs(y-yy));
        } 
    }
}
原文地址:https://www.cnblogs.com/lipu123/p/14059081.html