我的写法和题解有点不一样,是在每个记录了每个矩形的范围,再和其他的点判断是否能进行连边
#include <bits/stdc++.h>
#define pb push_back
#define P pair<int,int>
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int N=1005,inf=2e9;
int T;
int xs,ys,xt,yt;
int n;
int idx;
struct node{
int x,y,hang,lie;
}a[N<<2];
bool cmp(node xx,node yy)
{
return xx.x<yy.y;
}
int getlen(int i,int j)
{
return abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y);
}
vector<int>e[N<<2],le[N<<2];
int book[N<<2],dis[N<<2];
priority_queue<P>q;
void add(int i,int j,int leg)
{
e[i].pb(j),le[i].pb(leg);
e[j].pb(i),le[j].pb(leg);
}
void dij()
{
memset(book,0,sizeof book);
memset(dis,0x3f,sizeof dis);
dis[1]=0;
q.push(mp(0,1));
while(!q.empty())
{
int u=q.top().se;
q.pop();
if(book[u])
continue;
book[u]=1;
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i],w=le[u][i];
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!book[v])
q.push(mp(-dis[v],v));
}
}
}
if(dis[idx]==dis[0])
puts("No Path");
else
printf("%d\n",dis[idx]);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d",&xs,&ys,&xt,&yt,&n);
idx=0;
a[++idx]=(node){xs,ys,0,0};
for(int i=1;i<=n;i++)
{
int _1,_2,_3,_4;
scanf("%d%d%d%d",&_1,&_2,&_3,&_4);
if(_1>_3)
swap(_1,_3);
if(_2<_4)
swap(_2,_4);
int hhh=_3-_1;
int lll=_2-_4;
int id1,id2,id3,id4;
a[id1=++idx]=(node){_1,_2,hhh,-lll};//0
a[id2=++idx]=(node){_1,_4,hhh,lll};//2
a[id3=++idx]=(node){_3,_2,-hhh,-lll};//1
a[id4=++idx]=(node){_3,_4,-hhh,lll}; //3
add(id1,id2,getlen(id1,id2));
add(id1,id3,getlen(id1,id3));
add(id2,id4,getlen(id2,id4));
add(id3,id4,getlen(id3,id4));
}
a[++idx]=(node){xt,yt,0,0};
for(int i=1;i<=idx;i++)
e[i].clear(),le[i].clear();
// sort(a+1,a+1+idx,cmp);
for(int i=1;i<=idx;i++)
{
int id=-1,maxlen=inf;
for(int j=i+1;j<=idx;j++)
{
int lx=a[i].x,rx=a[i].x+a[i].hang;
int ly=a[i].y,ry=a[i].y+a[i].lie;
if(lx>rx)
swap(lx,rx);
if(ly>ry)
swap(ly,ry);
if(lx<=a[j].x && a[j].x<=rx)
{
int nowlen=getlen(i,j);
if(maxlen>nowlen)
maxlen=nowlen,id=j;
continue;
}
if(ly<=a[j].y && a[j].y<=ry)
{
int nowlen=getlen(i,j);
if(maxlen>nowlen)
maxlen=nowlen,id=j;
continue;
}
lx=a[j].x,rx=a[j].x+a[j].hang;
ly=a[j].y,ry=a[j].y+a[j].lie;
if(lx>rx)
swap(lx,rx);
if(ly>ry)
swap(ly,ry);
if(lx<=a[i].x && a[i].x<=rx)
{
int nowlen=getlen(i,j);
if(maxlen>nowlen)
maxlen=nowlen,id=j;
continue;
}
if(ly<=a[i].y && a[i].y<=ry)
{
int nowlen=getlen(i,j);
if(maxlen>nowlen)
maxlen=nowlen,id=j;
continue;
}
}
if(id!=-1)
{
e[i].pb(id),le[i].pb(maxlen);
e[id].pb(i),le[id].pb(maxlen);
}
}
dij();
}
return 0;
}