Right turn bunoj

关于转向的问题内什么难度就是写的时候思路要清晰   附带俩种代码  从时间上相差无几  但是从代码上明显自己写的更加复杂,也不知道当时为啥那么想,也许只是想用用新学的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;
}

 

 

 

 

 

 

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值