模拟题 Right turn SCU - 4445

用一个二维数组记录从四个方向到达该障碍物的次数,如果同一个方向到达该障碍物两次,那么就一定可以转无数次弯。

做题的时候心态要好啊。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#define maxn 1005
#define inf 0x3f3f3f3f
using namespace std;
typedef struct
{
    int x,y;
}P;
P a[maxn];
int v[4][maxn];
int ans,n,flag;
void solve()
{

    P c;
    c.x=0,c.y=0;
    int flag1,f;
    flag1=1;
    while(1)
    {
       // cout<<"flag "<<flag1<<" "<<c.x<<" "<<c.y<<endl;
        int mi,ma,j;
        mi=inf,ma=-inf,f=1;
        if(flag1==1)
        {
            for(int i=1;i<=n;i++)
            {
                if(c.y==a[i].y&&c.x<a[i].x&&a[i].x<mi)
                {
                    mi=a[i].x;
                    f=0;
                    j=i;
                }
            }
            if(f) return;
            else
            {
                if(v[0][j]) {flag=1;return ;}
                c.x=mi-1;
                ans++;
                flag1=2;
                v[0][j]=1;
            }
        }
        else if(flag1==2)
        {

            for(int i=1;i<=n;i++)
            {
                if(c.x==a[i].x&&c.y>a[i].y&&ma<a[i].y)
                {
                    ma=a[i].y;
                    f=0;
                    j=i;
                }
            }
            if(f) return ;
            else
            { 
                if(v[1][j]) {flag=1;return ;}
                c.y=ma+1;
                ans++;
                flag1=3;
                v[1][j]=1;
            }
        }
       else if(flag1==3)
        {
            for(int i=1;i<=n;i++)
            {
                if(c.y==a[i].y&&c.x>a[i].x&&a[i].x>ma)
                {
                    ma=a[i].x;
                    f=0;
                    j=i;
                }
            }
            if(f) return;
            else
            {
                if(v[2][j]){flag=1;return;}
                c.x=ma+1;
                ans++;
                flag1=4;
                v[2][j]=1;
            }
        }
        else if(flag1==4)
        {
            for(int i=1;i<=n;i++)
            {
                if(c.x==a[i].x&&c.y<a[i].y&&mi>a[i].y)
                {
                    mi=a[i].y;
                    f=0;
                    j=i;
                }
            }
            if(f) return ;
            else
            {
                if(v[3][j]) {flag=1;return;}
                c.y=mi-1;
                ans++;
                flag1=1;
                v[3][j]=1;
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d%d",&a[i].x,&a[i].y);
        ans=0;
        flag=0;
        memset(v,0,sizeof(v));
        solve();
        if(flag) printf("-1\n");
        else
        printf("%d\n",ans);

    }
    return 0;
}

 

posted @ 2017-08-17 21:33  Twsc  阅读(310)  评论(0编辑  收藏  举报