我艹,好水啊!!才110行
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
int lx,ly;
int rx,ry;
}rec[55];
struct point
{
int x,y;
int dis;
};
int hx[555],hy[555];
int n,m;
int sj,si,ei,ej;
int map[555][555];
int vis[555][555];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int getx(int x)
{
for(int i=1;i<=n;i++)
if(hx[i]==x) return i;
}
int gety(int y)
{
for(int i=1;i<=m;i++)
if(hy[i]==y) return i;
}
bool isok(int x,int y)
{
return x>=0&&x<=3*n&&y>=0&&y<=3*m;
}
void bfs()
{
queue<point> Q;
point tmp;
tmp.dis=-1;
memset(vis,0x3f,sizeof(vis));
for(int i=si*3;i>=si*3-2;i--)
for(int j=sj*3;j>=sj*3-2;j--)
if(map[i][j]==2)
{
tmp.x=i;tmp.y=j;
vis[i][j]=0;
Q.push(tmp);
}
point tt;
while(!Q.empty())
{
tmp=Q.front();
Q.pop();
for(int d=0;d<4;d++)
{
tt=tmp;tt.dis++;
tt.x+=dx[d];tt.y+=dy[d];
while(isok(tt.x,tt.y)&&map[tt.x][tt.y]!=1)
{
if(tt.dis<vis[tt.x][tt.y])
{
if(map[tt.x][tt.y]==3) {printf("%d\n",tt.dis);return;}
vis[tt.x][tt.y]=tt.dis;
Q.push(tt);
}
tt.x+=dx[d];tt.y+=dy[d];
}
}
}printf("-1\n");
}
int main()
{
int sx,sy,ex,ey,T,j;
while(scanf("%d%d%d%d",&sx,&sy,&ex,&ey))
{
if(!sx&&!sy&&!ex&&!ey) break;
j=3;
hx[1]=sx,hy[1]=sy;
hx[2]=ex,hy[2]=ey;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
scanf("%d%d%d%d",&rec[i].lx,&rec[i].ly,&rec[i].rx,&rec[i].ry);
if(rec[i].lx>rec[i].rx) {swap(rec[i].lx,rec[i].rx);swap(rec[i].ly,rec[i].ry);}
hx[j]=rec[i].lx;hy[j++]=rec[i].ly;hx[j]=rec[i].rx;hy[j++]=rec[i].ry;
}sort(hx+1,hx+j);sort(hy+1,hy+j);
n=m=2;
for(int i=2;i<j;i++) if(hx[i]!=hx[i-1]) hx[n++]=hx[i];n--;
for(int i=2;i<j;i++) if(hy[i]!=hy[i-1]) hy[m++]=hy[i];m--;
memset(map,0,sizeof(map));
si=getx(sx),sj=gety(sy);
ei=getx(ex),ej=gety(ey);
for(int i=si*3;i>=si*3-2;i--) for( j=sj*3;j>=sj*3-2;j--) map[i][j]=2;
for(int i=ei*3;i>=ei*3-2;i--) for(j=ej*3;j>=ej*3-2;j--) map[i][j]=3;
for(int i=1;i<=T;i++)
{
int x1=getx(rec[i].lx),y1=gety(rec[i].ly);
int x2=getx(rec[i].rx),y2=gety(rec[i].ry);
for(int i=x1*3;i<=x2*3-2;i++) for( j=y1*3;j<=y2*3-2;j++) map[i][j]=1;
}
for(int i=1;i<=n;i++) for( j=1;j<=m;j++)
{
if(map[i*3-2][j*3-2]==1&&map[i*3][j*3]==1||map[i*3-2][j*3]==1&&map[i*3][j*3-2]==1) map[i*3-1][j*3-1]=1;
if(map[i*3-1][j*3-2]==1&&map[i*3-1][j*3]==1) map[i*3-1][j*3-1]=1;
if(map[i*3-2][j*3-1]==1&&map[i*3][j*3-1]==1) map[i*3-1][j*3-1]=1;
}bfs();
}
return 0;
}