二分迷宫
链接: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
说明
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\n",abs(x-xx)+abs(y-yy)); } else if(y<=0&&yy<=0){ printf("%d\n",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\n",min(ans,p)+abs(y-yy)); } } }