您的位置:首页 > 其它

Right turn bunoj

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

,ay

,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;

}

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: