码迷,mamicode.com
首页 > 其他好文 > 详细

scu oj 4445 Right turn 2015年四川省赛J题(模拟题)

时间:2015-06-15 18:45:08      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:模拟

 一般的模拟题。对于出现过的每一个x建立一个set 集合,对于y也如此。然后查找要走到哪个点即可,主要要对状态记录,判断是否无线循环,否者出现无线循环的情况,就tle了。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<queue>
#include<cmath>
#include<map>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
const int mmax = 500010;
const int inf=0x3fffffff;
struct node
{
    int x,y;
    void read()
    {
        scanf("%d %d",&x,&y);
    }
    node(int x,int y):x(x),y(y) {}
    node() {}
    bool operator < (const node &a) const
    {
        if(x==a.x)
            return y<a.y;
        return x<a.x;
    }

}P[2100];
map<int,int>qx,qy;
set<int> Sx[2100],Sy[2100];
int dir[4][2]={1,0,0,-1,-1,0,0,1};
map<node,int>q;
bool vis[10100][4];
bool fuck(int x,int y)
{
    int cnt=0;
    for(int i=0;i<4;i++)
    {
        int tx=x+dir[i][0];
        int ty=y+dir[i][1];
//        if(x==0 && y==0)
//        {
//            cout<<tx<<" "<<ty<<endl;
//        }
        if(qx.count(tx)  &&  Sx[qx[tx]].count(ty))
        {
            //cout<<tx<<" "<<ty<<endl;
            cnt++;
        }
    }
    //cout<<"fuck"<<endl;
    return cnt==4;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        qx.clear();
        qy.clear();
        for(int i=0;i<1100;i++)
            Sx[i].clear(),Sy[i].clear();
        int cntx=0,cnty=0;
        for(int i=0;i<n;i++)
        {
            P[i].read();
            if(!qx.count(P[i].x))
                qx[P[i].x]=cntx++;
            if(!qy.count(P[i].y))
                qy[P[i].y]=cnty++;
            Sx[ qx[P[i].x]  ].insert(P[i].y);
            Sy[ qy[P[i].y]  ].insert(P[i].x);
            //if(P[i].x==1 && P[i].y==0)
                //cout<<qx [1]<<endl;
                //cout<<Sx[0].count(0)<<endl;
        }
        //cout<<qx[1]<<endl;
        //cout<<"fuck"<<endl;
        int nowx=0,nowy=0,nowdir=0;
        q.clear();
        int cc=0;
        int cnt=0;
        bool fg=1;
        memset(vis,0,sizeof vis);
        while(1)
        {

            //cout<<nowx<<" "<<nowy<<" "<<nowdir<<endl;
            if(!q.count(node(nowx,nowy)))
                q[node(nowx,nowy)]=cc++;
            if(vis[q[node(nowx,nowy)]][nowdir])
            {
                fg=0;
                break;
            }
            else
                vis[q[node(nowx,nowy)]][nowdir]=1;



            if(nowdir==0)
            {
                if(!qy.count(nowy))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sy[ qy[nowy] ].upper_bound(nowx);
                if(it!=Sy[ qy[nowy] ].end())
                {
                    int tx=*it;
                    tx--;
                    nowx=tx;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;
            }
            else if(nowdir==1)
            {
                if(!qx.count(nowx))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sx[ qx[nowx] ].lower_bound(nowy);
                if(it!=Sx[ qx[nowx] ].begin())
                {
                    it--;
                    int ty=*it;
                    ty++;
                    nowy=ty;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;
            }
            else if(nowdir==2)
            {
                if(!qy.count(nowy))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sy[ qy[nowy] ].lower_bound(nowx);
                if(it!=Sy[ qy[nowy] ].begin())
                {
                    it--;
                    int tx=*it;
                    tx++;
                    nowx=tx;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;

            }
            else if(nowdir==3)
            {
                if(!qx.count(nowx))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sx[ qx[nowx] ].upper_bound(nowy);
                if(it!=Sx[ qx[nowx] ].end())
                {
                    int ty=*it;
                    ty--;
                    nowy=ty;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;
            }
        }
        if(!fg)
            puts("-1");
        else
            printf("%d\n",cnt);

    }
    return 0;
}


scu oj 4445 Right turn 2015年四川省赛J题(模拟题)

标签:模拟

原文地址:http://blog.csdn.net/u012127882/article/details/46505851

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!