关于转向的问题内什么难度就是写的时候思路要清晰 附带俩种代码 从时间上相差无几 但是从代码上明显自己写的更加复杂,也不知道当时为啥那么想,也许只是想用用新学的MAP存;
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
//#include <memset>
#include <algorithm>
using namespace std;
#define N 1105
#define mod 19999997
#define LL long long
const int INF = 0xfffffffffffff;
#define exp 1e-8
struct fx
{
LL x,y,len;
}q;
map<LL,LL> vx;
map<LL,LL> vy;
queue<fx>Q;
LL ax[N][N],ay[N][N],b[1011][7],cx[1011],cy[1011],p;
int main()
{
LL t,i,j,l,w;
LL n,m,k,sum,l1,w1;
while(~scanf("%lld",&t))
{
sum=0;
while(!Q.empty())
Q.pop();
q.x=1;q.y=0;q.len=1;
Q.push(q);
q.x=0;q.y=-1;q.len=2;
Q.push(q);
q.x=-1;q.y=0;q.len=3;
Q.push(q);
q.x=0;q.y=1;q.len=4;
Q.push(q);
memset(b,0,sizeof(b));
memset(cx,0,sizeof(cx));
memset(cy,0,sizeof(cy));
vx.clear();
vy.clear();
LL numx=1,numy=1;
for(int i=0;i<t;i++)
{
scanf("%lld%lld",&l,&w);//printf("%lld",cx[i]);
if(vx[l]!=NULL)
;
else
vx[l]=numx++;
if(vy[w]!=NULL)
;
else
vy[w]=numy++;
ax[vx[l]][cx[vx[l]]]=w;
ay[vy[w]][cy[vy[w]]]=l;
cx[vx[l]]++;
cy[vy[w]]++;
}
for(int i=0;i<=t;i++)
{
sort(ax[i],ax[i]+cx[i]);
}
for(int i=0;i<=t;i++)
sort(ay[i],ay[i]+cy[i]);
l=w=0;
LL jj=1;
p=0;
LL lw=0;
while(jj)
{
lw=1;
LL ll;
q=Q.front();
Q.pop();
Q.push(q);
if(q.len==1)
{
ll=vy[w];
for(int i=0;i<cy[ll];i++)
{
if(ay[ll][i]>l)
{
l=ay[ll][i]-1;
/* if(b[ll][q.len]==1)
{
// printf("ss");
p=1;
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==2)
{
ll=vx[l];
for(int i=cx[ll]-1;i>=0;i--)
{
if(ax[ll][i]<w)
{
w=ax[ll][i]+1;
/* if(b[ll][q.len]==1)
{
// printf("ss");
p=1;
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==3)
{
ll=vy[w];
for(int i=cy[ll]-1;i>=0;i--)
{
if(ay[ll][i]<l)
{
l=ay[ll][i]+1;
/* if(b[ll][q.len]==1)
{
p=1;
//printf("ss");
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==4)
{
ll=vx[l];
for(int i=0;i<cx[ll];i++)
{
if(ax[ll][i]>w)
{
w=ax[ll][i]-1;
/* if(b[ll][q.len]==1)
{
//printf("ss");
p=1;
jj=0;
break;
}
b[ll][q.len]=1;*/
lw=0;
sum++;
break;
}
}
}
//printf("%lld %lld\n",l,w);
if(sum>4*t)
{
p=1;
break;
}
if(lw==1)
break;
}
// printf("%lld.",p);
if(p==1)
{
printf("-1\n");
}
else
printf("%lld\n",sum);
}
return 0;
}